Skip to content

Commit c8bc5eb

Browse files
committed
Various new functions and changes
* Implement Is*StreamedIn functions * Implemented most of the SA-MP Actor system * Finished implementing PVar system * Changes to class system for consistency with SA-MP * Change how OnPlayerEnter/ExitVehicle is called (SA-MP's callback behaves like MTA's onVehicleStartEnter/Exit instead) * Redo ApplyAnimation * Implement various natives: - IsValidVehicle - GetPlayerCameraPos - GetPlayerCameraFrontVector - alias GetConsoleVarAs* funcs with GetServerVarAs* funcs - Get/SetVehicleParamsEx - Get/SetVehicleParamsCarDoors - Get/UpdateVehicleDamageStatus - SetVehicleNumberPlate (was a stub before) - Get(Player/Vehicle)PoolSize - Get(Player/Vehicle)DistanceFromPoint - IsPlayerInRangeOfPoint - VectorSize - Actor natives
1 parent ddf0e36 commit c8bc5eb

File tree

5 files changed

+482
-39
lines changed

5 files changed

+482
-39
lines changed

amx/client/client.lua

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -511,9 +511,11 @@ addEventHandler('onClientElementStreamIn', root,
511511
vehInfo.blip = createBlipAttachedTo(source, 0, 1, 136, 136, 136, 150, 0, 500)
512512
setElementParent(vehInfo.blip, source)
513513
end
514-
serverAMXEvent('OnVehicleStreamIn', getElemID(source), getElemID(getLocalPlayer()))
514+
triggerServerEvent('onAmxClientVehicleStream', g_Me, getElemID(source), true)
515515
elseif getElementType(source) == 'player' then
516-
serverAMXEvent('OnPlayerStreamIn', getElemID(source), getElemID(getLocalPlayer()))
516+
triggerServerEvent('onAmxClientPlayerStream', g_Me, getElemID(source), true)
517+
elseif getElementType(source) == 'ped' and getElementData(source, 'amx.actorped') then
518+
triggerServerEvent('onAmxClientActorStream', g_Me, getElemID(source), true)
517519
end
518520
end
519521
)
@@ -529,9 +531,11 @@ addEventHandler('onClientElementStreamOut', root,
529531
end
530532
vehInfo.blip = nil
531533
end
532-
serverAMXEvent('OnVehicleStreamOut', getElemID(source), getElemID(getLocalPlayer()))
534+
triggerServerEvent('onAmxClientVehicleStream', g_Me, getElemID(source), false)
533535
elseif getElementType(source) == 'player' then
534-
serverAMXEvent('OnPlayerStreamOut', getElemID(source), getElemID(getLocalPlayer()))
536+
triggerServerEvent('onAmxClientPlayerStream', g_Me, getElemID(source), false)
537+
elseif getElementType(source) == 'ped' and getElementData(source, 'amx.actorped') then
538+
triggerServerEvent('onAmxClientActorStream', g_Me, getElemID(source), false)
535539
end
536540
end
537541
)

amx/server/amx.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ g_Objects = {}
88
g_Pickups = {}
99
g_Markers = {}
1010
g_SlothBots = {}
11+
g_Actors = {}
1112

1213
function initGameModeGlobals()
1314
g_PlayerClasses = {}
@@ -133,6 +134,7 @@ function loadAMX(fileName, res)
133134
amx.markers = {}
134135
amx.dbresults = {}
135136
amx.slothbots = {}
137+
amx.actors = {}
136138

137139
clientCall(root, 'addAMX', amx.name, amx.type)
138140

amx/server/defines.lua

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,10 @@ g_SpecialActions = {
160160
[SPECIAL_ACTION_SITTING] = { 'attractors', 'stepsit_loop' },
161161
[SPECIAL_ACTION_STOPUSECELLPHONE] = { 'ped', 'phone_out', -1, false, false }
162162
}
163+
164+
PLAYER_VARTYPE_NONE = 0
165+
PLAYER_VARTYPE_INT = 1
166+
PLAYER_VARTYPE_STRING = 2
167+
PLAYER_VARTYPE_FLOAT = 3
168+
169+
INVALID_ACTOR_ID = 0xFFFF

amx/server/events.lua

Lines changed: 99 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ function gameModeInit(player)
2121
toggleAllControls(player, false, true, false)
2222
clientCall(player, 'showIntroScene')
2323
clientCall(player, 'TogglePlayerClock', false, false)
24+
g_Players[playerID].pvars = {}
25+
g_Players[playerID].streamedActors = {}
26+
g_Players[playerID].streamedVehicles = {}
27+
g_Players[playerID].streamedPlayers = {}
2428
if g_PlayerClasses[0] then
2529
g_Players[playerID].viewingintro = true
2630
g_Players[playerID].doingclasssel = true
@@ -83,9 +87,6 @@ function joinHandler(player)
8387
end
8488
g_Players[playerID].updatetimer = setTimer(procCallOnAll, 100, 0, 'OnPlayerUpdate', playerID)
8589

86-
g_Players[playerID].pvars = {}
87-
88-
8990
if playerJoined then
9091
if getRunningGameMode() then
9192
gameModeInit(player)
@@ -315,7 +316,17 @@ addEventHandler('onPlayerWasted', root,
315316
procCallOnAll('OnPlayerDeath', playerID, killerID, weapon)
316317
if g_Players[playerID].returntoclasssel then
317318
g_Players[playerID].returntoclasssel = nil
318-
setTimer(putPlayerInClassSelection, 3000, 1, source)
319+
--setTimer(putPlayerInClassSelection, 3000, 1, source)
320+
setTimer(
321+
function()
322+
g_Players[playerID].spawninfo = nil
323+
g_Players[playerID].selectedclass = nil
324+
325+
if procCallOnAll('OnPlayerRequestClass', playerID, 0) then
326+
putPlayerInClassSelection(player)
327+
end
328+
end, 3000, 1, source
329+
)
319330
else
320331
setTimer(spawnPlayerBySelectedClass, 3000, 1, source, false)
321332
end
@@ -339,6 +350,11 @@ addEventHandler('onPlayerQuit', root,
339350
amx.playerobjects[source] = nil
340351
end
341352
local playerID = getElemID(source)
353+
354+
for i,playerdata in pairs(g_Players) do
355+
playerdata.streamedPlayers[playerID] = nil
356+
end
357+
342358
procCallOnAll('OnPlayerDisconnect', playerID, quitReasons[reason])
343359
if g_Players[playerID].blip then
344360
destroyElement(g_Players[playerID].blip)
@@ -383,13 +399,11 @@ addEventHandler('onVehicleEnter', root,
383399
local pedID = getElemID(player)
384400
g_Bots[pedID].vehicle = source
385401
setBotState(player, seat == 0 and PLAYER_STATE_DRIVER or PLAYER_STATE_PASSENGER)
386-
procCallOnAll('OnBotEnterVehicle', pedID, vehID, seat ~= 0 and 1 or 0)
387402
return
388403
end
389404
local playerID = getElemID(player)
390405
g_Players[playerID].vehicle = source
391406
setPlayerState(player, seat == 0 and PLAYER_STATE_DRIVER or PLAYER_STATE_PASSENGER)
392-
procCallInternal(amx, 'OnPlayerEnterVehicle', playerID, vehID, seat ~= 0 and 1 or 0)
393407

394408
if amx.vehicles[vehID] and amx.vehicles[vehID].respawntimer then
395409
killTimer(amx.vehicles[vehID].respawntimer)
@@ -398,6 +412,23 @@ addEventHandler('onVehicleEnter', root,
398412
end
399413
)
400414

415+
addEventHandler('onVehicleStartEnter', root,
416+
function(player, seat, jacked)
417+
local vehID = getElemID(source)
418+
local amx = getElemAMX(source)
419+
if not amx then
420+
return
421+
end
422+
if isPed(player) then
423+
local pedID = getElemID(player)
424+
procCallOnAll('OnBotEnterVehicle', pedID, vehID, seat ~= 0 and 1 or 0)
425+
return
426+
end
427+
local playerID = getElemID(player)
428+
procCallInternal(amx, 'OnPlayerEnterVehicle', playerID, vehID, seat ~= 0 and 1 or 0)
429+
end
430+
)
431+
401432
addEventHandler('onVehicleExit', root,
402433
function(player, seat, jacker)
403434
local amx = getElemAMX(source)
@@ -410,13 +441,11 @@ addEventHandler('onVehicleExit', root,
410441
local pedID = getElemID(player)
411442
g_Bots[pedID].vehicle = nil
412443
setBotState(player, PLAYER_STATE_ONFOOT)
413-
procCallOnAll('OnBotExitVehicle', pedID, vehID)
414444
return
415445
end
416446

417447
local playerID = getElemID(player)
418448
g_Players[playerID].vehicle = nil
419-
procCallOnAll('OnPlayerExitVehicle', playerID, vehID)
420449
setPlayerState(player, PLAYER_STATE_ONFOOT)
421450

422451
for i=0,getVehicleMaxPassengers(source) do
@@ -433,10 +462,26 @@ addEventHandler('onVehicleExit', root,
433462
)
434463

435464
addEventHandler('onVehicleStartExit', root,
436-
function()
465+
function(player, seat, jacked, door)
466+
local amx = getElemAMX(source)
467+
local vehID = getElemID(source)
468+
if not amx then
469+
return
470+
end
471+
437472
if g_RCVehicles[getElementModel(source)] then
438473
cancelEvent()
474+
return
475+
end
476+
477+
if isPed(player) then
478+
local pedID = getElemID(player)
479+
procCallOnAll('OnBotExitVehicle', pedID, vehID)
480+
return
439481
end
482+
483+
local playerID = getElemID(player)
484+
procCallOnAll('OnPlayerExitVehicle', playerID, vehID)
440485
end
441486
)
442487

@@ -594,3 +639,48 @@ addEventHandler('onPlayerChangeNick', root,
594639
cancelEvent()
595640
end
596641
)
642+
643+
-- Actors
644+
addEvent('onAmxClientActorStream', true)
645+
addEventHandler('onAmxClientActorStream', root,
646+
function(actorId, streamed)
647+
local playerID = getElemID(source)
648+
if streamed then
649+
g_Players[playerID].streamedActors[actorId] = true
650+
procCallOnAll('OnActorStreamIn', actorId, playerID)
651+
else
652+
g_Players[playerID].streamedActors[actorId] = nil
653+
procCallOnAll('OnActorStreamOut', actorId, playerID)
654+
end
655+
end
656+
)
657+
658+
-- Players
659+
addEvent('onAmxClientPlayerStream', true)
660+
addEventHandler('onAmxClientPlayerStream', root,
661+
function(otherId, streamed)
662+
local playerID = getElemID(source)
663+
if streamed then
664+
g_Players[playerID].streamedPlayers[otherId] = true
665+
procCallOnAll('OnPlayerStreamIn', otherId, playerID)
666+
else
667+
g_Players[playerID].streamedPlayers[otherId] = nil
668+
procCallOnAll('OnPlayerStreamOut', otherId, playerID)
669+
end
670+
end
671+
)
672+
673+
-- Vehicles
674+
addEvent('onAmxClientVehicleStream', true)
675+
addEventHandler('onAmxClientVehicleStream', root,
676+
function(vehicleID, streamed)
677+
local playerID = getElemID(source)
678+
if streamed then
679+
g_Players[playerID].streamedVehicles[vehicleID] = true
680+
procCallOnAll('OnVehicleStreamIn', vehicleID, playerID)
681+
else
682+
g_Players[playerID].streamedVehicles[vehicleID] = nil
683+
procCallOnAll('OnVehicleStreamOut', vehicleID, playerID)
684+
end
685+
end
686+
)

0 commit comments

Comments
 (0)