-
Posts
306 -
Joined
-
Last visited
-
Days Won
1
Posts posted by Klesh
-
-
-
-
Sorry for the double posting, i edited the textlib.lua, making the function dxDrawColorText, replacing line 270, 272 with dxDrawColorText, but the kills are not showing.
dxText = {}
dxText_mt = { __index = dxText }
local idAssign,idPrefix = 0,"c"
local g_screenX,g_screenY = guiGetScreenSize()
local visibleText = {}
------
local defaults = {
fX = 0.5,
fY = 0.5,
bRelativePosition = true,
strText = "",
bVerticalAlign = "center",
bHorizontalAlign = "center",
tColor = {255,255,255,255},
fScale = 1,
strFont = "default",
strType = "normal",
tAttributes = {},
bPostGUI = false,
bClip = false,
bWordWrap = true,
bVisible = true,
tBoundingBox = false, --If a bounding box is not set, it will not be used.
bRelativeBoundingBox = true,
}
local validFonts = {
default = true,
["default-bold"] = true,
clear = true,
arial = true,
pricedown = true,
bankgothic = true,
diploma = true,
beckett = true,
}
local validTypes = {
normal = true,
shadow = true,
border = true,
stroke = true, --Clone of border
}
local validAlignTypes = {
center = true,
left = true,
right = true,
}
function dxText:create( text, x, y, relative )
assert(not self.fX, "attempt to call method 'create' (a nil value)")
if ( type(text) ~= "string" ) or ( not tonumber(x) ) or ( not tonumber(y) ) then
outputDebugString ( "dxText:create - Bad argument", 0, 112, 112, 112 )
return false
end
local new = {}
setmetatable( new, dxText_mt )
--Add default settings
for i,v in pairs(defaults) do
new[i] = v
end
idAssign = idAssign + 1
new.id = idPrefix..idAssign
new.strText = text or new.strText
new.fX = x or new.fX
new.fY = y or new.fY
if type(relative) == "boolean" then
new.bRelativePosition = relative
end
visibleText[new] = true
return new
end
function dxText:text(text)
if type(text) ~= "string" then return self.strText end
self.strText = text
return true
end
function dxText:position(x,y,relative)
if not tonumber(x) then return self.fX, self.fY end
self.fX = x
self.fY = y
if type(relative) == "boolean" then
self.bRelativePosition = relative
else
self.bRelativePosition = true
end
return true
end
function dxText:color(r,g,b,a)
if not tonumber(r) then return unpack(self.tColor) end
g = g or self.tColor[2]
b = b or self.tColor[3]
a = a or self.tColor[4]
self.tColor = { r,g,b,a }
return true
end
function dxText:scale(scale)
if not tonumber(scale) then return self.fScale end
self.fScale = scale
return true
end
function dxText:visible(bool)
if type(bool) ~= "boolean" then return self.bVisible end
self.bVisible = bool
if bool then
visibleText[self] = true
else
visibleText[self] = nil
end
return true
end
function dxText:destroy()
self.bDestroyed = true
setmetatable( self, self )
return true
end
function dxText:extent()
local extent = dxGetTextWidth ( self.strText, self.fScale, self.strFont )
if self.strType == "stroke" or self.strType == "border" then
extent = extent + self.tAttributes[1]
end
return extent
end
function dxText:height()
local height = dxGetFontHeight ( self.fScale, self.strFont )
if self.strType == "stroke" or self.strType == "border" then
height = height + self.tAttributes[1]
end
return height
end
function dxText:font(font)
if not validFonts[font] then return self.strFont end
self.strFont = font
return true
end
function dxText:postGUI(bool)
if type(bool) ~= "boolean" then return self.bPostGUI end
self.bPostGUI = bool
return true
end
function dxText:clip(bool)
if type(bool) ~= "boolean" then return self.bClip end
self.bClip = bool
return true
end
function dxText:wordWrap(bool)
if type(bool) ~= "boolean" then return self.bWordWrap end
self.bWordWrap = bool
return true
end
function dxText:type(type,...)
if not validTypes[type] then return self.strType, unpack(self.tAttributes) end
self.strType = type
self.tAttributes = {...}
return true
end
function dxText:align(horzA, vertA)
if not validAlignTypes[horzA] then return self.bHorizontalAlign, self.bVerticalAlign end
vertA = vertA or self.bVerticalAlign
self.bHorizontalAlign, self.bVerticalAlign = horzA, vertA
return true
end
function dxText:boundingBox(left,top,right,bottom,relative)
if left == nil then
if self.tBoundingBox then
return unpack(boundingBox)
else
return false
end
elseif tonumber(left) and tonumber(right) and tonumber(top) and tonumber(bottom) then
self.tBoundingBox = {left,top,right,bottom}
if type(relative) == "boolean" then
self.bRelativeBoundingBox = relative
else
self.bRelativeBoundingBox = true
end
else
self.tBoundingBox = false
end
return true
end
addEventHandler ( "onClientRender", getRootElement(),
function()
for self,_ in pairs(visibleText) do
while true do
if self.bDestroyed then
visibleText[self] = nil
break
end
local l,t,r,b
--If we arent using a bounding box
if not self.tBoundingBox then
--Decide if we use relative or absolute
local p_screenX,p_screenY = 1,1
if self.bRelativePosition then
p_screenX,p_screenY = g_screenX,g_screenY
end
local fX,fY = (self.fX)*p_screenX,(self.fY)*p_screenY
if self.bHorizontalAlign == "left" then
l = fX
r = fX + g_screenX
elseif self.bHorizontalAlign == "right" then
l = fX - g_screenX
r = fX
else
l = fX - g_screenX
r = fX + g_screenX
end
if self.bVerticalAlign == "top" then
t = fY
b = fY + g_screenY
elseif self.bVerticalAlign == "bottom" then
t = fY - g_screenY
b = fY
else
t = fY - g_screenY
b = fY + g_screenY
end
elseif type(self.tBoundingBox) == "table" then
local b_screenX,b_screenY = 1,1
if self.bRelativeBoundingBox then
b_screenX,b_screenY = g_screenX,g_screenY
end
l,t,r,b = self.tBoundingBox[1],self.tBoundingBox[2],self.tBoundingBox[3],self.tBoundingBox[4]
l = l*b_screenX
t = t*b_screenY
r = r*b_screenX
b = b*b_screenY
end
local type,att1,att2,att3,att4,att5 = self:type()
if type == "border" or type == "stroke" then
att2 = att2 or 0
att3 = att3 or 0
att4 = att4 or 0
att5 = att5 -
-
Then the trouble its, there is no comunication with the team to solve trouble together?
That's bad, cuz mta team works everydays trying to solve bugs, troubles or making a better game, it is but more cant be.
-
I was watching arround the web, and i saw i web site, it puts the server stats on a banner, when i add a server it adds the wrong number of player, then they say something about the MTA Team; see this link, its true that ?
-
Im trying to enable hexadecimal in killmessages resource, but now its no showing, here is the edited code:
local customKills = {}
local config = {
["lines"] = 5,
["startY"] = 0.35,
["textHeight"] = 16,
["iconPosOffY"] = -10,
["iconHeight"] = 20,
["iconSpacing"] = 4,
["defaultWeapon"] = 255,
["fadeTime"] = 5000,
["startFade"] = 15000,
["align"] = "right",
["startX"] = -10
}
local default = {
["lines"] = 5,
["startY"] = 0.25,
["textHeight"] = 16,
["iconPosOffY"] = -10,
["iconHeight"] = 20,
["iconSpacing"] = 4,
["defaultWeapon"] = 255,
["fadeTime"] = 5000,
["startFade"] = 15000,
["align"] = "right",
["startX"] = -10
}
local endTime
local screenX,screenY = guiGetScreenSize ()
local contentMessages = {}
local fadingLines = {}
---
local iconOrder = {}
function setupTextOnStart ( resource )
if resource ~= getThisResource() then return end
triggerServerEvent ( "onClientKillmessagesLoaded", getLocalPlayer() )
end
addEventHandler ( "onClientResourceStart", getRootElement(), setupTextOnStart )
addEvent ("doSetKillMessageStyle",true)
function setKillMessageStyle ( startX,startY,align,lines,fadeStart,fadeAnimTime )
if ( not startX ) then startX = default.startX end
if ( not startY ) then startY = default.startY end
if ( not align ) then align = default.align end
if ( not lines ) then lines = default.lines end
if ( not fadeStart ) then fadeStart = default.startFade end
if ( not fadeAnimTime ) then fadeAnimTime = default.fadeTime end
config.startX = startX
config.startY = startY
config.align = align
config.lines = lines
config.startFade = fadeStart
config.fadeTime = fadeAnimTime
if #contentMessages ~= 0 then
for i=1,config.lines do
if contentMessages[i] then
destroyLine ( i )
end
end
end
fadingLines = {}
killMessages = {}
if ( config.startY < 0 ) then
config.startY = screenY - math.abs(config.startY*screenY) - (config.iconHeight*config.lines)
config.startY = config.startY/screenY
end
createKillMessageGUI()
return true
end
addEventHandler ( "doSetKillMessageStyle",getRootElement(),setKillMessageStyle)
function createKillMessageGUI()
local gap = config.iconHeight - config.textHeight
gap = gap/2
for i=1,config.lines do
local y = config.startY*screenY + (config.iconHeight*(i-1))
y = y + gap
contentMessages[i] = { dxText:create("",0,y) }
end
endTime = config.fadeTime + config.startFade
end
function shiftUpGUI()
local i = 1
for i=config.lines,2,-1 do
local y = config.startY*screenY + (config.iconHeight*(i-1)) + (config.iconHeight - config.textHeight)/2
local targetY = config.startY*screenY + (config.iconHeight*(i-2)) + (config.iconHeight - config.textHeight)/2
for k,part in ipairs(contentMessages[i]) do
local x,realY = getWidgetPosition(part)
local diffY = realY - y
setWidgetPosition(part,x,targetY + diffY)
end
end
for i=1,config.lines-1 do
---shift up the alpha too
local tick = fadingLines[i+1]
fadingLines[i] = tick
fadingLines[i+1] = nil
end
end
addEvent ( "doOutputMessage", true )
function outputMessage ( message, r, g, b, font )
if type(message) ~= "string" and type(message) ~= "table" then
outputDebugString ( "outputMessage - Bad 'message' argument", 0, 112, 112, 112 )
return false
end
if type(font) ~= "string" then
font = "default"
end
r = tonumber(r) or 255
g = tonumber(g) or 255
b = tonumber(b) or 255
---shift everything up
shiftUpGUI()
--Delete the first line
destroyLine (1)
table.remove ( contentMessages, 1 )
if type(message) == "string" then
message = {message}
end
local y = config.startY*screenY + (config.iconHeight*(config.lines-1)) + (config.iconHeight - config.textHeight)/2
local startX = config.startX
if startX < 1 and startX > -1 then --auto calculate whether its relative or absolute
startX = screenX/startX --make it relative
end
if startX < 0 then
startX = screenX + startX
end
for i,part in ipairs(message) do
if type(part) == "table" and part[1] == "image" then
if not part.resource and not part.resourceName then
part.resource = sourceResource
end
end
end
drawLine ( message, startX, y, config.align, config.lines, r, g, b, font, 1 )
fadeLine ( config.lines )
end
addEventHandler ( "doOutputMessage", getRootElement(), outputMessage )
function drawLine ( message, x,y, align, line, r, g, b, font, scale )
--First draw it and work out the width
local width = 0
contentMessages[line] = {}
for i,part in ipairs(message) do
if type(part) == "string" then
local text = dxDrawColoredText:create ( part, width, y, false )
text:font ( font )
text:scale ( scale )
text:type("shadow",1)
text:align"left"
text:color ( r,g,b )
table.insert ( contentMessages[line], text )
width = width + text:extent()
elseif part[1] == "icon" then
local iconWidth = part.width or iconWidths[part.id or -1] or iconWidths[255]
local iconHeight = part.height or config.iconHeight
local image = dxImage:create ( icons[part.id or 0] or icons[255], width, y + (part.posOffY or config.iconPosOffY), iconWidth, iconHeight, false )
image:color ( part.r or 255, part.g or 255, part.b or 255 )
image:rotation ( part.rot or 0, part.rotOffX or 0, part.rotOffY or 0 )
width = width + iconWidth
table.insert ( contentMessages[line], image )
elseif part[1] == "image" then
if part.width and part.path then
if part.resourceName then
part.resource = getResourceFromName(tostring(part.resourceName)) or part.resource
end
local image = dxImage:create ( ":"..getResourceName(part.resource).."/"..part.path, width, y + (part.posOffY or config.iconPosOffY), part.width, part.height or config.iconHeight, false )
image:color ( part.r or 255, part.g or 255, part.b or 255 )
image:rotation ( part.rot or 0, part.rotOffX or 0, part.rotOffY or 0 )
width = width + part.width
table.insert ( contentMessages[line], image )
end
elseif part[1] == "color" or part[1] == "colour" then
r = part.r or r
g = part.g or g
b = part.b or b
elseif part[1] == "padding" then
width = width + part.width or 0
end
contentMessages[line].scale = scale
end
--Now reposition everything properly
if align == "center" or align == "centre" then
x = x - width/2
elseif align == "right" then
x = x - width
end
for i,widget in ipairs(contentMessages[line]) do
local wx,wy = getWidgetPosition ( widget )
setWidgetPosition ( widget, x + wx, wy )
end
return true
end
function fadeLine ( line )
setLineAlpha ( line, 1 )
fadingLines[line] = getTickCount()
end
-----
addEventHandler ( "onClientRender",getRootElement(),
function()
for line,originalTick in pairs(fadingLines) do
local tickDifference = getTickCount() - originalTick
if tickDifference > endTime then
destroyLine ( line )
setLineAlpha ( line, 1 )
fadingLines[line] = nil
elseif tickDifference > config.startFade then
local fadeTimeDifference = tickDifference - config.startFade
--calculate the alpha
local newAlpha = 1 - fadeTimeDifference/config.fadeTime
--Set all the alphas
setLineAlpha ( line, newAlpha )
end
end
end )
function setLineAlpha ( line, alpha )
for i,part in ipairs(contentMessages[line]) do
setWidgetAlpha ( part, alpha )
end
end
function destroyLine ( line )
for k,part in ipairs(contentMessages[line]) do
destroyWidget(part)
end
contentMessages[line] = {}
end
function destroyWidget ( widget )
if isElement(widget) then
destroyElement ( widget )
elseif type(widget) == "table" and widget.destroy then
widget:destroy()
end
end
function getWidgetPosition ( widget )
if isElement(widget) then
return guiGetPosition ( widget, false )
elseif type(widget) == "table" and widget.position then
return widget:position()
end -
Thanks i didn't see that point, my fault.
-
I want to cancel kill, nobody cant kill.
function playerDamage_text ( attacker, weapon, bodypart, loss ) --when a player is damaged cancelEvent() end addEventHandler ( "onPlayerDamage", getRootElement (), playerDamage_text )
-
Thanks a lot, i wasn't saw setTime.
-
Hello, im asking this cuz editing meta with the zombie game of slothman not work, with my map, what functions i can use to block the time in game, thanks for any help.
-
Did you put in meta client side or server side?
Is server side.
-
Next time set your gui variable, its more easier to find errosr if you have them.
Gui scripts always are client side.
Ps: Any error on debug?
-
That data will save the current function you are creating:
function housePrice (thePlayer) -----Complete your code setElementData(thePlayer, "price.data") end
I recomendete to you, use database, is stored on the db, more effective, try to start learn if you don't know.
-
Did you delete the scoreboard resource ? That's the trouble, the resource don't find it, check if you have it, if you renamed, you must put the old name "scoreboard", directory C:\Program Files\MTA San Andreas 1.2\server\mods\deathmatch\resources\[gameplay]
- 1
-
It's posible but setting the data:
function myHouse (thePlayer....) -- -- ---- setElement(thePlayer"house.data") --- end function getMyHouse (thePlayer) getElementData(thePlayer"house.data") -- -- end
Also you can try with db:
-
Do you mean then i have to edit lib, with definition first of the dxdrawcoloredtext, replacing dxCreateTex it can work then?
-
Check the new one, it shows in grey with dxColoredText.
-
Hello i want this script to allow hexadecimal colors, it show's grey:
addEvent ("onClientPlayerKillMessage",true) function onClientPlayerKillMessage ( killer,weapon,wr,wg,wb,kr,kg,kb,width,resource ) if wasEventCancelled() then return end outputKillMessage ( source, wr,wg,wb,killer,kr,kg,kb,weapon,width,resource ) end addEventHandler ("onClientPlayerKillMessage",getRootElement(),onClientPlayerKillMessage) function outputKillMessage ( source, wr,wg,wb,killer,kr,kg,kb,weapon,width,resource ) if not iconWidths[weapon] then if type(weapon) ~= "string" then weapon = 999 end end local killerName local wastedName if not tonumber(wr) then wr = 255 end if not tonumber(wg) then wg = 255 end if not tonumber(wb) then wb = 255 end if not tonumber(kr) then kr = 255 end if not tonumber(kg) then kg = 255 end if not tonumber(kb) then kb = 255 end if ( source ) then if isElement ( source ) then if getElementType ( source ) == "player" then wastedName = getPlayerName ( source ) else outputDebugString ( "outputKillMessage - Invalid 'wasted' player specified",0,0,0,100) return false end elseif type(source) == "string" then wastedName = source end else outputDebugString ( "outputKillMessage - Invalid 'wasted' player specified",0,0,0,100) return false end if ( killer ) then if isElement ( killer ) then if getElementType ( killer ) == "player" then killerName = getPlayerName ( killer ) else outputDebugString ( "outputKillMessage - Invalid 'killer' player specified",0,0,0,100) return false end elseif type(killer) == "string" then killerName = killer else killerName = "" end else killerName = "" end --create the new text if not killerName then killerName = killerName:gsub("#%x%x%x%x%x%x", "") end return outputMessage ( {killerName, {"padding",width=3}, {"icon",id=weapon}, {"padding",width=3},{"color",r=wr,g=wg,b=wb}, wastedName}, kr,kg,kb ) killerName = killerName:gsub("#%x%x%x%x%x%x", "") end
edit : New way but the message shows in grey.
-
You dind't say nothing about no outputChatBox, and like solids says, its easy, just replace output to your code.
-
Don't double post, so easy like this, try with it, its not needed to call getAccountData,is stored, and when you logged the data is unpack, so with this you know how many cash you have, so simple like that.
ffunction loginMoney (source) local playerMoney = getPlayerMoney(source) outputChatBox("Your current money is " .. playerMoney.. " $ cash.", source, 255, 0, 0, true) end addEventHandler("onPlayerLogin", getRootElement(), loginMoney) function commandMoney(source,commandName) local money = getPlayerMoney(source) outputChatBox("Your current money is " .. money.. " $ cash.", source, 255, 0, 0, true) end addCommandHandler("money", commandMoney)
Tested.
Ps: The code show's the current money, the code works when playerJoin, and /money command.
-
It cant be, cuz you are joining, are you sure the money is saving on your server? Default server doesn't save money.
Removed : addCommandHandler("show", loginMoney) totally useless if you want to show when player joins.
-
Is not more easy using getElementData() ?
Its more effective than this, you will set the team, put them on it, when player quit and joins again, it returns to the team, i was made that.
-
If do you want get the Playermoney when player joins try that:
Easy code
function loginMoney (thePlayer) if (getPlayerMoney(thePlayer) then outputChatBox("Welcome to my server, your current money is" ..getPlayerMoney(thePlayer)..".",thePlayer, 255, 0, 0, true) end if isGuestAccount then outputChatBox("Sorry you can see how money you have, you must be logged in", thePlayer, 255, 0, 0, true) end end) addEventHandler("onPlayerJoin", getRootElement(), loginMoney)
Urgente: Salvemos Internet de la Ley S.O.P.A. !FIRMEMOS YA!
in Offtopic
Posted
Firmado.