John Smith

[OFFERING] John Smith / ZoeN's scripting services [PAID]

Recommended Posts

Hello there. I am John Smith, also known as ZoeN. Today, I am here to offer my scripting services. Will they cost money? Yes. How much? I'll talk about it soon in this topic.

Some info about me:
I am an 18 year old guy from Croatia who has a particular interest in scripting on Multi Theft Auto. I've firstly started off back in 2014,
going from simple Hello World scripts, to what I am today. A fully experienced MTA scripter with lots of experience and knowledge
on how to do scripts, ranging from smaller projects to even bigger projects such as whole gamemodes and multigamemodes.

What can I do?
Basically anything. I've already done lots of resources. Examples would be:

  • Custom Race Gamemode
  • Custom Freeroam Gamemode
  • Custom Downloader (both for Freeroam and DM-like gamemodes)
  • Map Loader
  • Script Loader
  • Multigamemode
  • Login Panel
  • Punishment System
  • Userpanel
  • and many more which I haven't mentioned

while I favour working on developing new gamemodes, let's be realistic that most customers won't come to me for that;  the center of my service are custom requests, which means you can ask me to script (or fix) anything you'd like, after which I will consider it and tell you if it's possible, and if so, suggest a price that can be further negotiated. I will start development, and you can test it out on my testserver before paying, so you can confirm it's in good working state and nothing from your requested features is missing. After the resource/code is sent, there'll be extended support for bugs that may appear after delivery, as I am pretty confident of my code's quality.

How much do I charge?
It really depends on lot of factors, such as complexity, time needed to do the job, and what you're asking me to do.

For instance, smaller scripts would be in range of something like 5-10€, while
bigger scripts would be in range of 10-30€, depending on their complexity.

Finally, complete gamemodes (written from scratch) would be charged somewhat in this terms:

  • Small Gamemodes -- 50€
  • Big Gamemodes -- 100€+

(for big gamemodes, that is a minimum price, however it may change to a higher one depending on what you're requesting, also based on complexity and time needed to complete the gamemode)

Why are complete gamemodes so expensive?
Well, because especially gamemodes takes some time, if not even a long time.
Then, there's also the fact that the scripts which I'm creating are profesionally written and optimized, they're not amateur.

Think of it as getting a tattoo on your body. You'd want the tattoo to be good and to still be fine even after years have passed right?
You certainly don't want your tattoo to be made by an amateur and to have your tattoo fade away under 6 months.

Any examples of my work?
To be honest here, I haven't really made any public resources as I've always preferred to create private scripts (usually for my server(s)). I just have 1 public resource out there; https://community.mtasa.com/index.php?p=resources&s=details&id=14725

To give you a sense of my code, let me quickly share the core of that resource (open spoiler);

Spoiler

-- -- This script also re-integrates the healthbar (MTA hardcoded to custom one) but with the same looks, cannot be noticed it's a new one. This is needed to overcome technical limitations.																																														

-- Nametag Settings --
local Nametags = {
	showing = false;		-- don't touch this, it's already auto-enabled with onClientResourceStart (but if you change that you'll need to edit this variable)
	font = "default-bold";		-- nametag font
	shadow = true;			-- whether or not to make shadow of nametag's text (so that it can be seen in any environment)
	showHealthbar = true;	-- whether or not to show health bar and armor bar
	hpBarWidth = 122;		-- Max health bar width (132 because i think max nick length is 22 and dxGetTextWidth returns around 132 for that length)
	hpBarHeight = 13;		-- Health bar height
	scale = 1;				-- Font scale
	shadowRecThickness = 6;	-- Thickness of shadow around healthbar
	maxDistance = 10;		-- Distance at which nametag starts to fade out
	adaptToTeam = true;		-- Should player's nametag color be changed to team's if player has a team?
};


function Player:GetNick() -- returns hexless nick
	return self:getName():gsub("#%x%x%x%x%x%x", "");
end

function getPedMaxHealth(ped)
    -- Output an error and stop executing the function if the argument is not valid
    assert(isElement(ped) and (getElementType(ped) == "ped" or getElementType(ped) == "player"), "Bad argument @ 'getPedMaxHealth' [Expected ped/player at argument 1, got " .. tostring(ped) .. "]")

    -- Grab his player health stat.
    local stat = getPedStat(ped, 24)

    -- Do a linear interpolation to get how many health a ped can have.
    -- Assumes: 100 health = 569 stat, 200 health = 1000 stat.
    local maxhealth = 100 + (stat - 569) / 4.31

    -- Return the max health. Make sure it can't be below 1
    return math.max(1, maxhealth)
end

function dxDrawEmptyRectangle(startX, startY, endX, endY, color, width, postGUI)
	dxDrawLine ( startX, startY, startX+endX, startY, color, width, postGUI )
	dxDrawLine ( startX, startY, startX, startY+endY, color, width, postGUI )
	dxDrawLine ( startX, startY+endY, startX+endX, startY+endY,  color, width, postGUI )
	dxDrawLine ( startX+endX, startY, startX+endX, startY+endY, color, width, postGUI )
end

function IsColorcode(s)
	local n = s:gsub("#%x%x%x%x%x%x", "");
	if (#n) < (#s) then return true else return false end;
end

function Nametags.render()
	
	local bIgnoreDistance = false;
	local people = {};

	-- Check if we're aiming at someone, if yes, force the nametag to be shown
	if localPlayer:getTargetStart() and localPlayer:getTargetEnd() and getKeyState("mouse2") then

		local sx, sy, sz = getPedTargetStart(localPlayer);
		local ex, ey, ez = getPedTargetEnd(localPlayer);
		bIgnoreDistance, _, _, _, hitElement = processLineOfSight(sx, sy, sz, ex, ey, ez, false, true, true, false, false, true, false, true, localPlayer, false, false);
		
		-- Check if it's a player or is it a vehicle with players
		if hitElement then
			
			if hitElement:getType() == "player" then
				people[hitElement] = true;
			
			elseif hitElement:getType() == "vehicle" then
				
				-- get passengers if there are any
				for _, v in pairs(getVehicleOccupants(hitElement)) do
					people[v] = true;
				end

			end
		end

	end

	for i, player in pairs(getElementsByType("player", nil, true)) do

		local x, y, z = getPedBonePosition(player, 2);
		local mx, my, mz = getCameraMatrix();
		local distance = getDistanceBetweenPoints3D(mx, my, mz, x, y, z);

		if player ~= localPlayer and ( distance <= 50 or people[player] == true) then

			if isLineOfSightClear( mx, my, mz, x, y, z, true, false, false, true, false, false, false, localPlayer ) then

				local additional_z = .20;
				local X, Y = getScreenFromWorldPosition(x, y, z + additional_z);

				if X and Y then

					local text = Nametags.shadow and player:GetNick() or player:getName();
					local texto = player:getName();

					local r, g, b;
				
					local alpha = 175;
					local font = IsColorcode(texto) and "default-bold" or "default";

					-- Check for team
					if player:getTeam() and Nametags.adaptToTeam then
						r, g, b = player:getTeam():getColor();
					else
						r, g, b = player:getNametagColor();
					end

					-- Should we fade out? --
					if distance >= Nametags.maxDistance and not bIgnoreDistance then

						local leftover = distance - Nametags.maxDistance;
						alpha = math.max(0, alpha - distance * (leftover/5));
					
					end

					-- Draw player text --
					dxDrawText(text, X - dxGetTextWidth(text, Nametags.scale, font), Y, X + dxGetTextWidth(text, Nametags.scale, font), Y, Nametags.shadow and tocolor(0, 0, 0, alpha) or tocolor(r, g, b, alpha), Nametags.scale, font, "center", "top", false, false, false, Nametags.shadow and false or true);

					if Nametags.shadow then
						dxDrawText(texto, X - dxGetTextWidth(texto, Nametags.scale, font) - 1, Y - 1, X + dxGetTextWidth(texto, Nametags.scale, font) - 1, Y - 1, tocolor(r, g, b, alpha), Nametags.scale, font, "center", "top", false, false, false, true);
					end

					-- Draw healthbar --
					if Nametags.showHealthbar then

						local fontHeight = dxGetFontHeight(Nametags.scale, font);
						local distanceScaling = distance * 1.5;
						local alpha2 = alpha - 150;
						local alphaDivider = 255 / 150;

						-- Alpha fix --
						if alpha2 < 10 then
							alpha2 = 0
						end

						-- If we are aiming from distance longer than fade distance then dont scale the rectangles --
						if (bIgnoreDistance and distance > Nametags.maxDistance) or (distance > Nametags.maxDistance + (distance - Nametags.maxDistance)) then
							distanceScaling = 0;
							distance = 0;
						end

						local multiplier = Nametags.hpBarWidth / getPedMaxHealth(player);
						local middleDistanceScale =  (  (X - Nametags.hpBarWidth / 2 + distanceScaling / 2 ) - (X - Nametags.hpBarWidth / 2)  ) / 2;
						local colorMultiplier = 255 / getPedMaxHealth(player);
						local armor = player:getArmor();
						local divider = (10-(player:getHealth()/getPedMaxHealth(player))*8);

						local recX = X - Nametags.hpBarWidth / 2 + middleDistanceScale;
						local recY = Y + fontHeight + Nametags.shadowRecThickness * 2 - distanceScaling / 10;
						local recWidth = math.max(player:getHealth() * multiplier - distanceScaling / divider, 1); -- distanceScaling / 10 makes it so low health doesnt 'decrease' when you get far away from player but it causes issue of full health getting out of healtbar, and distanceScaling / 2 makes it at full health to stay inside but on small health when you go away from player it looks like his health is lowering
						local recHeight = Nametags.hpBarHeight - distanceScaling / 20;

						-- Dead issue fix --
						if player:getHealth() == 0 then
							recWidth = 0;
						end

						-- Fix when player has 200hp eventho his max is 100, and fixes other impossible cases, this is actually more of a safeguard that health bar never gets out of its 'prison'
						if recWidth > Nametags.hpBarWidth then
							recWidth = Nametags.hpBarWidth - Nametags.shadowRecThickness;
						end

						dxDrawRectangle(recX - Nametags.shadowRecThickness, recY - Nametags.shadowRecThickness, Nametags.hpBarWidth + Nametags.shadowRecThickness * 2 - distanceScaling / 2, recHeight + Nametags.shadowRecThickness * 2, armor > 0 and tocolor(120, 120, 120, alpha) or tocolor(0, 0, 0, alpha));
						dxDrawRectangle(recX, recY, Nametags.hpBarWidth - distanceScaling / 2, recHeight, tocolor(0, 0, 0, alpha));
						dxDrawRectangle(recX, recY, Nametags.hpBarWidth - distanceScaling / 2, recHeight, tocolor(math.max(255 - player:getHealth() * colorMultiplier, 0), math.max(0 + player:getHealth() * colorMultiplier, 0), 0, alpha2));

						dxDrawRectangle(recX, recY, recWidth, recHeight, tocolor(math.max(255 - player:getHealth() * colorMultiplier, 0), math.max(0 + player:getHealth() * colorMultiplier, 0), 0, alpha));

					end

				end

			end

		end

	end

end


function Nametags:isShowing()
	return Nametags.showing;
end


function Nametags:setShowing(bShowing)
	if bShowing then
		if not Nametags:isShowing() then
			addEventHandler("onClientRender", root, Nametags.render);
			Nametags.showing = true;
		end
	else
		if Nametags:isShowing() then
			removeEventHandler("onClientRender", root, Nametags.render);
			Nametags.showing = false;
		end
	end
end


addEventHandler("onClientResourceStart", resourceRoot,
	function()
		
		-- Disable nametags for everyone --
		for _, player in pairs(getElementsByType("player")) do
			player:setNametagShowing(false);
		end

		Nametags:setShowing(true);

	end
);

addEventHandler("onClientPlayerJoin", root,
	function()
		source:setNametagShowing(false);
	end
);

 


However, I did make a video about one project of mine, 3 years ago.


You may also notice that there's a Level System and HUD, both developed by me, also 3 years ago.
I was pretty good at scripting even back then, but at the current moment, I'm a beast :D

How can you contact me?

  • Discord: ZoeN#4774
  • Private Message on this Forum

 

Thank you for reading. If you have any questions regarding me and/or my services, contact me, and I'll reply to you as soon as I can.

- John Smith (aka ZoeN)

  • Like 2

Share this post


Link to post

Uh, I couldn't find an edit button for my topic so I'll have to mention it here;

I've changed my Discord username to ZoeN#4774 so if you're going to contact me over Discord, use this name instead.

Share this post


Link to post

Hi there!

Since this topic was created, I've done a good amount of jobs here and there but after a few months Iwent inactive.

With this new message I want to announce that I am back and that if you need scripting services that I can provide them!

 

Feel free to contact me on Discord (ZoeN#4774) or PM me here :)

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.