Skip to content

Commit 87041b5

Browse files
authored
Merge branch 'master' into control_fix
2 parents 69ecb51 + 66a8b20 commit 87041b5

File tree

16 files changed

+393
-85
lines changed

16 files changed

+393
-85
lines changed

[admin]/admin/conf/skins.xml

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
<group name="Special">
66
<skin model="1" name="Truth" />
77
<skin model="2" name="Maccer" />
8-
<skin model="5" name="Big Bear(Large)"/>
9-
<skin model="6" name="White Croupier"/>
10-
<skin model="8" name="Cab Driver"/>
11-
<skin model="42" name="Suzie"/>
12-
<skin model="86" name="Tracksuit Girl (Pink)" />
8+
<skin model="5" name="Big Bear(Large)" />
9+
<skin model="6" name="White Croupier" />
10+
<skin model="8" name="Cab Driver" />
11+
<skin model="42" name="Suzie" />
12+
<skin model="86" name="Tracksuit Girl (Pink)" />
1313
<skin model="265" name="Tenpenny" />
1414
<skin model="266" name="Pulaski" />
1515
<skin model="267" name="Hern" />
@@ -171,8 +171,8 @@
171171
<skin model="287" name="Army" />
172172
</group>
173173
<group name="Police">
174-
<skin model="3" name="Deputy Officer"/>
175-
<skin model="4" name="Sheriff"/>
174+
<skin model="3" name="Deputy Officer" />
175+
<skin model="4" name="Sheriff" />
176176
<skin model="190" name="Barbara Schternvart" />
177177
<skin model="246" name="Cop Stripper" />
178178
<skin model="280" name="Cop 1" />
@@ -194,7 +194,6 @@
194194
<skin model="88" name="Casual Old Lady" />
195195
<skin model="89" name="Cleaning Lady" />
196196
<skin model="103" name="Baller Jacket" />
197-
<skin model="103" name="Baller Jacket" />
198197
<skin model="105" name="Grove Sweater" />
199198
<skin model="130" name="Native Ugly" />
200199
<skin model="151" name="Melanie" />
@@ -214,7 +213,7 @@
214213
<skin model="17" name="Black suit" />
215214
<skin model="57" name="Chinese Businessman" />
216215
<skin model="61" name="Pilot" />
217-
<skin model="65" name="Air Traffic Controller (1)"/>
216+
<skin model="65" name="Air Traffic Controller (1)" />
218217
<skin model="76" name="Businesswoman 1" />
219218
<skin model="141" name="Cute Librarian" />
220219
<skin model="147" name="Sigmund Freud" />
@@ -229,8 +228,8 @@
229228
<skin model="228" name="Japanese Businessman 3" />
230229
<skin model="255" name="Limo Driver" />
231230
<skin model="263" name="Asian Hostess" />
232-
<skin model="273" name="Reporter"/>
233-
<skin model="289" name="Air Traffic Controller (2)"/>
231+
<skin model="273" name="Reporter" />
232+
<skin model="289" name="Air Traffic Controller (2)" />
234233
</group>
235234
<group name="Fighters">
236235
<skin model="49" name="Ninja Sensei" />
@@ -286,7 +285,7 @@
286285
<skin model="29" name="White Dealer" />
287286
<skin model="30" name="Religious Essey" />
288287
<skin model="47" name="Top Button Essey" />
289-
<skin model="48" name="Hippy Maley" />
288+
<skin model="48" name="Hippy Maley" />
290289
<skin model="67" name="Red Bandana" />
291290
<skin model="143" name="Sam Jackson" />
292291
<skin model="241" name="Afro Brother" />

[admin]/admin2/conf/skins.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<skin model="92" name="Rollergirl" />
99
<skin model="96" name="Soccer Player" />
1010
<skin model="97" name="Baywatch Dude" />
11+
<skin model="98" name="Worker Male" />
1112
<skin model="138" name="Bikini Tattoo" />
1213
<skin model="139" name="Yellow Bikini" />
1314
<skin model="140" name="Buxom Bikini" />
@@ -240,6 +241,7 @@
240241
<skin model="29" name="White Dealer" />
241242
<skin model="30" name="Religious Essey" />
242243
<skin model="47" name="Top Button Essey" />
244+
<skin model="48" name="Hippy Maley" />
243245
<skin model="67" name="Red Bandana" />
244246
<skin model="143" name="Sam Jackson" />
245247
<skin model="241" name="Afro Brother" />
@@ -266,6 +268,7 @@
266268
<skin model="212" name="Tin Foil Hat" />
267269
<skin model="213" name="Hobo Elvis" />
268270
<skin model="230" name="Hooded Hobo" />
271+
<skin model="239" name="Homeless Bob" />
269272
</group>
270273
<group name="Nightclubbers">
271274
<skin model="43" name="Porn Producer" />

[admin]/security/events.lua

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,26 @@ addEventHandler("onPlayerTriggerInvalidEvent", root, clientTriggersInvalidEvent)
1212
function clientTriggersEventThreshold()
1313
logViolation(source, "Exceeded event trigger threshold of "..tostring(getServerConfigSetting("max_player_triggered_events_per_interval")));
1414
end
15-
addEventHandler("onPlayerTriggerEventThreshold", root, clientTriggersEventThreshold);
15+
addEventHandler("onPlayerTriggerEventThreshold", root, clientTriggersEventThreshold);
16+
17+
18+
19+
-- https://wiki.multitheftauto.com/wiki/OnPlayerConnect
20+
-- we use onPlayerConnect event to check if the player got a valid username
21+
function clientConnectServer(strPlayerNick, strPlayerIP, strPlayerUsername, strPlayerSerial, iPlayerVersionNumber, strPlayerVersionString)
22+
if(not isPlayerNameValid(strPlayerNick)) then
23+
logAction("Client "..strPlayerNick.." with IP "..strPlayerIP.." and Serial "..strPlayerSerial.." tried to join with invalid nickname! Version: "..iPlayerVersionNumber.." | "..strPlayerVersionString);
24+
cancelEvent(true, "INVALID NICKNAME!");
25+
return;
26+
end
27+
end
28+
addEventHandler("onPlayerConnect", root, clientConnectServer);
29+
30+
31+
32+
-- https://wiki.multitheftauto.com/wiki/OnPlayerChangesWorldSpecialProperty
33+
-- gets triggered when client changes world special property
34+
function clientChangesWorldSpecialProperty(strProperty, bEnabled)
35+
logViolation(source, "Changed world special property \""..strProperty.."\" to "..tostring(bEnabled));
36+
end
37+
addEventHandler("onPlayerChangesWorldSpecialProperty", root, clientChangesWorldSpecialProperty);

[admin]/security/meta.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<meta>
22
<info name="Security" author="-ffs-PLASMA" type="misc" version="1.0" description="Basic security functionality" />
33

4-
<min_mta_version server="1.6.0-9.22470" />
4+
<min_mta_version server="1.6.0-9.22790" />
55

6+
<script src="utils.lua" type="server"/>
67
<script src="logging.lua" type="server"/>
78
<script src="events.lua" type="server"/>
89
<script src="misc.lua" type="server"/>

[admin]/security/players.lua

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
-- used to check how many explosion/projectile sync packets a client sends overtime
2+
local iExplosionCheckInterval = 3000; -- the interval in ms to check for players sending too many explosion and projectile sync packets
3+
local tblPlayerProjectiles = {}; -- store players sending projectile sync packets
4+
local tblRegularExplosions = {}; -- store players sending regular explosion sync packets
5+
local tblVehicleExplosions = {}; -- store players sending vehicle explosion sync packets
6+
local iPlayerProjectileThreshold = 10; -- the threshold when we consider client suspicious for projectile creations
7+
local iRegularExplosionThreshold = 10; -- the threshold when we consider client suspicious for regular explosions
8+
local iVehicleExplosionThreshold = 10; -- the threshold when we consider client suspicious for vehicle explosions
9+
10+
11+
112
-- add the elementdatas you want to protect from client updates in here
213
local tblProtectedElementDatas = {["Score"] = true};
314

@@ -16,6 +27,18 @@ addEventHandler("onElementDataChange", root, clientChangesElementData);
1627

1728

1829

30+
-- https://wiki.multitheftauto.com/wiki/OnPlayerChangesProtectedData
31+
-- gets triggered when a client tries to change protected element data
32+
-- see elementdata_whitelisted config https://wiki.multitheftauto.com/wiki/Server_mtaserver.conf#elementdata_whitelisted
33+
-- this needs to be setup in conjunction with your existing elementdatas to take necessary action!
34+
-- the key feature is to prevent the client from updating non synced server elementdatas if they know the key and attached element
35+
function clientChnagesProtectedData(uElement, strKey, unValue)
36+
logViolation(source, "Tried to change protected elementdata for key "..tostring(strKey).." to value "..tostring(unValue).." for element "..tostring(uElement).." ("..getElementType(uElement)..")");
37+
end
38+
addEventHandler("onPlayerChangesProtectedData", root, clientChnagesProtectedData);
39+
40+
41+
1942
-- https://wiki.multitheftauto.com/wiki/OnPlayerACInfo
2043
-- gets triggered when AC detects something for client on connect
2144
function clientNotifyACInfo(tblDetectedACList, iD3D9Size, strD3D9MD5, strD3D9SHA256)
@@ -55,4 +78,80 @@ function clientNetworkStatus(iStatus, iTicks)
5578
logViolation(source, "Network interruption has stopped after "..iTicks.." ticks");
5679
end
5780
end
58-
addEventHandler("onPlayerNetworkStatus", root, clientNetworkStatus);
81+
addEventHandler("onPlayerNetworkStatus", root, clientNetworkStatus);
82+
83+
84+
85+
-- https://wiki.multitheftauto.com/wiki/OnPlayerProjectileCreation
86+
-- gets triggered when a player creates a projectile sync packets (eg. shoots a weapon, vehicle weapon or via createProjectile)
87+
function clientCreateProjectile(iWeaponType, fPX, fPY, fPZ, fForce, uTarget, fRX, fRY, fRZ, fVX, fVY, fVZ)
88+
if(isElement(source)) then
89+
if(tblPlayerProjectiles[source]) then
90+
tblPlayerProjectiles[source] = tblPlayerProjectiles[source] + 1;
91+
else
92+
tblPlayerProjectiles[source] = 1;
93+
end
94+
end
95+
end
96+
addEventHandler("onPlayerProjectileCreation", root, clientCreateProjectile);
97+
98+
99+
100+
-- https://wiki.multitheftauto.com/wiki/OnExplosion
101+
-- gets triggered when an explosion occurs, either via server script or client sync packet
102+
function clientCreateExplosion(fPX, fPY, fPZ, iType)
103+
if(isElement(source)) then
104+
if(getElementType(source) == "player") then
105+
if(tblRegularExplosions[source]) then
106+
tblRegularExplosions[source] = tblRegularExplosions[source] + 1;
107+
else
108+
tblRegularExplosions[source] = 1;
109+
end
110+
end
111+
end
112+
end
113+
addEventHandler("onExplosion", root, clientCreateExplosion);
114+
115+
116+
117+
-- https://wiki.multitheftauto.com/wiki/OnVehicleExplode
118+
-- gets triggered when a vehicle explodes, either via server script or client sync packet
119+
function clientCreateVehicleExplosion(bWithExplosion, uPlayer)
120+
if(isElement(uPlayer)) then
121+
if(tblVehicleExplosions[uPlayer]) then
122+
tblVehicleExplosions[uPlayer] = tblVehicleExplosions[uPlayer] + 1;
123+
else
124+
tblVehicleExplosions[uPlayer] = 1;
125+
end
126+
end
127+
end
128+
addEventHandler("onVehicleExplode", root, clientCreateVehicleExplosion);
129+
130+
131+
132+
-- setup a timer with specified interval above and check if any client sent too many sync packets in the given time
133+
-- thresholds need to be adjusted for your need and actions taken!
134+
setTimer(function()
135+
for uPlayer, iCounter in pairs(tblPlayerProjectiles) do
136+
if(iCounter >= iPlayerProjectileThreshold) then
137+
logViolation(uPlayer, "Exceeded projectile threshold "..tostring(iPlayerProjectileThreshold).." - Count: "..tostring(iCounter));
138+
end
139+
end
140+
141+
for uPlayer, iCounter in pairs(tblRegularExplosions) do
142+
if(iCounter >= iRegularExplosionThreshold) then
143+
logViolation(uPlayer, "Exceeded regular explosions threshold "..tostring(iRegularExplosionThreshold).." - Count: "..tostring(iCounter));
144+
end
145+
end
146+
147+
for uPlayer, iCounter in pairs(tblVehicleExplosions) do
148+
if(iCounter >= iVehicleExplosionThreshold) then
149+
logViolation(uPlayer, "Exceeded vehicle explosions threshold "..tostring(iVehicleExplosionThreshold).." - Count: "..tostring(iCounter));
150+
end
151+
end
152+
153+
tblPlayerProjectiles = {};
154+
tblRegularExplosions = {};
155+
tblVehicleExplosions = {};
156+
157+
end, iExplosionCheckInterval, 0);

[admin]/security/utils.lua

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-- checks if a player nickname is valid in terms of length and ascii chars
2+
function isPlayerNameValid(strPlayerName)
3+
if(not strPlayerName) then return false end;
4+
if(not tostring(strPlayerName)) then return false end;
5+
if(#strPlayerName == 0) then return false end;
6+
if(#strPlayerName > 22) then return false end;
7+
8+
for i = 1, #strPlayerName do
9+
local strChar = strPlayerName:sub(i, i);
10+
local iCharByte = strChar:byte();
11+
12+
if(iCharByte < 33 or iCharByte > 126) then return false end;
13+
end
14+
15+
return true;
16+
end

0 commit comments

Comments
 (0)