From 40ffe31324b3f8765c06ac18791b60410f718cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Thu, 17 Aug 2017 17:40:47 +0200 Subject: [PATCH] New instance code --- client/main.lua | 97 +++++++++++++++++++++++++++++++++++++------------ server/main.lua | 91 ++++++++++++++++++++++++---------------------- 2 files changed, 122 insertions(+), 66 deletions(-) diff --git a/client/main.lua b/client/main.lua index 80989c6d..bea70293 100644 --- a/client/main.lua +++ b/client/main.lua @@ -10,32 +10,40 @@ local Keys = { ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 } -local GUI = {} -GUI.Time = 0 -local Instance = {} -local InstanceInvite = nil -local InstancedPlayers = {} +local GUI = {} +GUI.Time = 0 +local Instance = {} +local InstanceInvite = nil +local InstancedPlayers = {} +local RegisteredInstanceTypes = {} function ShowNotification(msg) SetNotificationTextEntry('STRING') AddTextComponentString(msg) - DrawNotification(0,1) + DrawNotification(0, 1) end function GetInstance() return Instance end -function CreateInstance() - TriggerServerEvent('instance:create') +function CreateInstance(type, data) + TriggerServerEvent('instance:create', type, data) end function CloseInstance() + Instance = {} TriggerServerEvent('instance:close') end function EnterInstance(instance) - TriggerServerEvent('instance:enter', InstanceInvite.host) + + TriggerServerEvent('instance:enter', instance.host) + + if RegisteredInstanceTypes[instance.type].enter ~= nil then + RegisteredInstanceTypes[instance.type].enter(instance) + end + end function LeaveInstance() @@ -46,21 +54,32 @@ function LeaveInstance() TriggerEvent('esx:showNotification', _U('left_instance')) end + if RegisteredInstanceTypes[Instance.type].exit ~= nil then + RegisteredInstanceTypes[Instance.type].exit(Instance) + end + TriggerServerEvent('instance:leave', Instance.host) end end -function InviteToInstance(player, pos) - TriggerServerEvent('instance:invite', Instance.host, player, pos) +function InviteToInstance(type, player, pos) + TriggerServerEvent('instance:invite', Instance.host, type, player, pos) +end + +function RegisterInstanceType(type, enter, exit) + RegisteredInstanceTypes[type] = { + enter = enter, + exit = exit + } end AddEventHandler('instance:get', function(cb) cb(GetInstance()) end) -AddEventHandler('instance:create', function() - CreateInstance() +AddEventHandler('instance:create', function(type, data) + CreateInstance(type, data) end) AddEventHandler('instance:close', function() @@ -75,13 +94,12 @@ AddEventHandler('instance:leave', function() LeaveInstance() end) -AddEventHandler('instance:invite', function(player, pos) - InviteToInstance(player, pos) +AddEventHandler('instance:invite', function(type, player, pos) + InviteToInstance(type, player, pos) end) -RegisterNetEvent('instance:onData') -AddEventHandler('instance:onData', function(instance) - Instance = instance +AddEventHandler('instance:registerType', function(name, enter, exit) + RegisterInstanceType(name, enter, exit) end) RegisterNetEvent('instance:onInstancedPlayersData') @@ -89,12 +107,45 @@ AddEventHandler('instance:onInstancedPlayersData', function(instancedPlayers) InstancedPlayers = instancedPlayers end) +RegisterNetEvent('instance:onCreate') +AddEventHandler('instance:onCreate', function(instance) + Instance = {} +end) + +RegisterNetEvent('instance:onEnter') +AddEventHandler('instance:onEnter', function(instance) + Instance = instance +end) + +RegisterNetEvent('instance:onLeave') +AddEventHandler('instance:onClose', function(instance) + Instance = {} +end) + +RegisterNetEvent('instance:onClose') +AddEventHandler('instance:onClose', function(instance) + Instance = {} +end) + +RegisterNetEvent('instance:onPlayerEntered') +AddEventHandler('instance:onPlayerEntered', function(instance, player) + Instance = instance + ShowNotification(GetPlayerName(GetPlayerFromServerId(player)) .. ' est entré dans l\'instance') +end) + +RegisterNetEvent('instance:onPlayerLeft') +AddEventHandler('instance:onPlayerLeft', function(instance, player) + Instance = instance + ShowNotification(GetPlayerName(GetPlayerFromServerId(player)) .. ' est sorti dans l\'instance') +end) + RegisterNetEvent('instance:onInvite') -AddEventHandler('instance:onInvite', function(instance, pos) +AddEventHandler('instance:onInvite', function(instance, type, data) InstanceInvite = { + type = type, host = instance, - pos = pos + data = data } Citizen.CreateThread(function() @@ -110,6 +161,8 @@ AddEventHandler('instance:onInvite', function(instance, pos) end) +RegisterInstanceType('default') + -- Input invites Citizen.CreateThread(function() while true do @@ -135,9 +188,7 @@ Citizen.CreateThread(function() local playerPed = GetPlayerPed(-1) - EnterInstance(InstanceInvite.host) - - SetEntityCoords(playerPed, InstanceInvite.pos.x, InstanceInvite.pos.y, InstanceInvite.pos.z) + EnterInstance(InstanceInvite) ShowNotification(_U('entered_instance')) diff --git a/server/main.lua b/server/main.lua index d8309566..47dd9cc4 100644 --- a/server/main.lua +++ b/server/main.lua @@ -14,14 +14,16 @@ function GetInstancedPlayers() end -function CreateInstance(player) - +function CreateInstance(type, player, data) + Instances[player] = { + type = type, host = player, - players = {player} + players = {}, + data = data } - TriggerClientEvent('instance:onData', player, Instances[player]) + TriggerClientEvent('instance:onCreate', player, Instances[player]) TriggerClientEvent('instance:onInstancedPlayersData', -1, GetInstancedPlayers()) end @@ -29,7 +31,7 @@ end function CloseInstance(instance) for i=1, #Instances[instance].players, 1 do - TriggerClientEvent('instance:onData', Instances[instance].players[i], {}) + TriggerClientEvent('instance:onClose', Instances[instance].players[i]) end Instances[instance] = nil @@ -53,8 +55,13 @@ function AddPlayerToInstance(instance, player) table.insert(Instances[instance].players, player) end + TriggerClientEvent('instance:onEnter', player, Instances[instance]) + for i=1, #Instances[instance].players, 1 do - TriggerClientEvent('instance:onData', Instances[instance].players[i], Instances[instance]) + if Instances[instance].players[i] ~= player then + TriggerClientEvent('instance:onPlayerEntered', Instances[instance].players[i], Instances[instance], player) + end + end TriggerClientEvent('instance:onInstancedPlayersData', -1, GetInstancedPlayers()) @@ -63,37 +70,50 @@ end function RemovePlayerFromInstance(instance, player) - if Instances[instance].host == player then - - CloseInstance(instance) - - else + if Instances[instance] ~= nil then - for i=1, #Instances[instance].players, 1 do - if Instances[instance].players[i] == player then - Instances[instance].players[i] = nil + TriggerClientEvent('instance:onLeave', player, Instances[instance]) + + if Instances[instance].host == player then + + for i=1, #Instances[instance].players, 1 do + if Instances[instance].players[i] ~= player then + TriggerClientEvent('instance:onPlayerLeft', Instances[instance].players[i], Instances[instance], player) + end end + + CloseInstance(instance) + + else + + for i=1, #Instances[instance].players, 1 do + if Instances[instance].players[i] == player then + Instances[instance].players[i] = nil + end + end + + for i=1, #Instances[instance].players, 1 do + if Instances[instance].players[i] ~= player then + TriggerClientEvent('instance:onPlayerLeft', Instances[instance].players[i], Instances[instance], player) + end + + end + + TriggerClientEvent('instance:onInstancedPlayersData', -1, GetInstancedPlayers()) + end - TriggerClientEvent('instance:onData', player, {}) - - for i=1, #Instances[instance].players, 1 do - TriggerClientEvent('instance:onData', Instances[instance].players[i], Instances[instance]) - end - - TriggerClientEvent('instance:onInstancedPlayersData', -1, GetInstancedPlayers()) - end end -function InvitePlayerToInstance(instance, player, pos) - TriggerClientEvent('instance:onInvite', player, instance, pos) +function InvitePlayerToInstance(instance, type, player, data) + TriggerClientEvent('instance:onInvite', player, instance, type, data) end RegisterServerEvent('instance:create') -AddEventHandler('instance:create', function() - CreateInstance(source) +AddEventHandler('instance:create', function(type, data) + CreateInstance(type, source, data) end) RegisterServerEvent('instance:close') @@ -112,22 +132,7 @@ AddEventHandler('instance:leave', function(instance) end) RegisterServerEvent('instance:invite') -AddEventHandler('instance:invite', function(instance, player, pos) - InvitePlayerToInstance(instance, player, pos) +AddEventHandler('instance:invite', function(instance, type, player, data) + InvitePlayerToInstance(instance, type, player, data) end) -TriggerEvent('es:addCommand', 'instance_create', function(source, args, user) - CreateInstance(source) -end) - -TriggerEvent('es:addCommand', 'instance_invite', function(source, args, user) - InvitePlayerToInstance(tonumber(args[2]), tonumber(args[3]), { - x = tonumber(args[4]), - y = tonumber(args[5]), - z = tonumber(args[6]), - }) -end) - -TriggerEvent('es:addCommand', 'instance_enter', function(source, args, user) - AddPlayerToInstance(source, tonumber(args[2])) -end)