Jump to content

اكسبورت لمود


Recommended Posts

السلام عليكم - دا مود الكتابة فوق الراس ابي اسوي له اكسبورت كيف ؟

--
-- dxCreateRoundedTexture
-- https://github.com/Pioruniasty/MTA_rounded_rectangle
-- https://forum.multitheftauto.com/viewtopic.php?f=108&t=96096
-- Author: Piorun
-- All credits of this function to him
--

function dxCreateRoundedTexture(text_width,text_height,radius)
	assert(text_width,"Missing argument 'text_width' at dxCreateRoundedTexture")
	assert(text_height,"Missing argument 'height' at dxCreateRoundedTexture")
	assert(radius,"Missing argument 'radius' at dxCreateRoundedTexture")
	if type(text_width) ~= "number" then outputDebugString("Bad argument @ 'dxCreateRoundedTexture' [Excepted number at argument 1, got " .. type(text_width) .. "]",2) return false end
	if type(text_height) ~= "number" then outputDebugString("Bad argument @ 'dxCreateRoundedTexture' [Excepted number at argument 2, got " .. type(text_height) .. "]",2) return false end
	if type(radius) ~= "number" then outputDebugString("Bad argument @ 'dxCreateRoundedTexture' [Excepted number at argument 3, got " .. type(radius) .. "]",2) return false end
	if text_width < 0 then outputDebugString("text_width can't be less than 0",1) return false end
	if text_height < 0 then outputDebugString("text_height can't be less than 0",1) return false end
	if radius < 0 or radius > 100 then outputDebugString("Parameter 'radius' can't be between 0 and 100",1) return false end

	local texture = DxTexture(text_width,text_height)
	local pix = texture:getPixels()

	radius = (radius * (text_height / 2)) / 100

	for x=0,text_width do
		for y=0,text_height do
			if x >= radius and x <= text_width - radius then
				dxSetPixelColor(pix,x,y,255,255,255,255)
			end
			if y >= radius and y <= text_height - radius then
				dxSetPixelColor(pix,x,y,255,255,255,255)
			end
			if math.sqrt((x - radius)^2 + (y - radius)^2) < radius then
				dxSetPixelColor(pix,x,y,255,255,255,255) -- lewy gorny rog
			end
			if math.sqrt((x - (text_width - radius))^2 + (y - radius)^2) < radius then
				dxSetPixelColor(pix,x,y,255,255,255,255) -- prawy gorny rog
			end
			if math.sqrt((x - radius)^2 + (y - (text_height - radius))^2) < radius then
				dxSetPixelColor(pix,x,y,255,255,255,255) -- lewy dolny rog
			end
			if math.sqrt((x - (text_width - radius))^2 + (y - (text_height - radius))^2) < radius then
				dxSetPixelColor(pix,x,y,255,255,255,255) -- prawy dolny rog
			end
		end
	end
	texture:setPixels(pix)
	return texture
end
local selfVisible = true -- Want to see your own message?
local messages = {} -- {text, player, lastTick, alpha, yPos}
local textures = {}
local timeVisible = 8500
local distanceVisible = 30
local bubble = true -- Rounded rectangle(true) or not(false)

function addBubble(text, player, tick)
	if (not messages[player]) then
		messages[player] = {}
	end
	local width = dxGetTextWidth(text:gsub("#%x%x%x%x%x%x", ""), 1, "default-bold")
	local _texture = dxCreateRoundedTexture(width+16,20,100)
	table.insert(messages[player], {["text"] = text, ["player"] = player, ["tick"] = tick, ["endTime"] = tick + 2000, ["alpha"] = 0, ["texture"] = _texture})
end

function removeBubble()
	table.remove(messages)
end

addEvent("onChatIncome", true)
addEventHandler("onChatIncome", root,
	function(message, messagetype)
		if source ~= localPlayer then
			addBubble(message, source, getTickCount())
		elseif selfVisible then
			addBubble(message, source, getTickCount())
		end
	end
)


-- outElastic | Got from https://github.com/EmmanuelOga/easing/blob/master/lib/easing.lua
local pi = math.pi
function outElastic(t, b, c, d, a, p)
  if t == 0 then return b end

  t = t / d

  if t == 1 then return b + c end

  if not p then p = d * 0.3 end

  local s

  if not a or a < math.abs(c) then
    a = c
    s = p / 4
  else
    s = p / (2 * pi) * math.asin(c/a)
  end

  return a * math.pow(2, -10 * t) * math.sin((t * d - s) * (2 * pi) / p) + c + b
end

addEventHandler("onClientRender", root, 
	function()
		local tick = getTickCount()
		local x, y, z = getElementPosition(localPlayer)
		for _, pMessage in pairs(messages) do
			for i, v in ipairs(pMessage) do
				if isElement(v.player) then
					if tick-v.tick < timeVisible then
						local px, py, pz = getElementPosition(v.player)
						if getDistanceBetweenPoints3D(x, y, z, px, py, pz) < distanceVisible and isLineOfSightClear ( x, y, z, px, py, pz, true, not isPedInVehicle(v.player), false, true) then
							v.alpha = v.alpha < 200 and v.alpha + 5 or v.alpha
							local bx, by, bz = getPedBonePosition(v.player, 6)
							local sx, sy = getScreenFromWorldPosition(bx, by, bz)
		
							local elapsedTime = tick - v.tick
							local duration = v.endTime - v.tick
							local progress = elapsedTime / duration
							
							if sx and sy then
								if not v.yPos then v.yPos = sy end
								local width = dxGetTextWidth(v.text:gsub("#%x%x%x%x%x%x", ""), 1, "default-bold")
								--local yPos = interpolateBetween ( v.yPos, 0, 0, sy - 22*i, 0, 0, progress, "OutElastic")
								local yPos = outElastic(elapsedTime, v.yPos, ( sy - 22*i ) - v.yPos, duration, 5)
								if bubble then
									dxDrawImage ( sx-width/2-10, yPos - 16, width+16, 20, v.texture, nil, nil, tocolor(0, 0, 0, v.alpha) )
								else
									dxDrawRectangle(sx-width/2-10, yPos - 16, width+16, 20, tocolor(0, 0, 0, v.alpha))
								end
								dxDrawText(v.text, sx-width/2-2, yPos - 14, width, 20, tocolor( 255, 255, 255, v.alpha+50), 1, "default-bold", "left", "top", false, false, false, true)
							end
						end
					else
						table.remove(messages[v.player], i)
					end
				else
					table.remove(messages[v.player], i)
				end
			end
		end
	end
)
function outputMessage(element, text)
	assert(isElement(element), "outputMessage @ Bad argument: expected element at argument 1, got "..type(element).." "..tostring(element))
	triggerClientEvent("onChatIncome", element, tostring(text))
end

function sendMessageToClient(message,messagetype)
	if not wasEventCancelled() then
		if messagetype == 0 or messagetype == 2 then
			triggerClientEvent("onChatIncome", source, message, messagetype)
		end
	end
end
addEventHandler("onPlayerChat",getRootElement(),sendMessageToClient)

<meta>
    <info author="Sasuke*" type="script" name="Bubble chat" version="1.2.2" />
	<oop>true</oop>

	<script src="round.lua" type="client" />	
	<script src="client.lua" type="client" />
	<script src="server.lua" type="server" />
	
	<export function="outputMessage" type="server"/>
</meta>

 

Link to comment

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.
×
×
  • Create New...