SA:MP быстрое удаление трупов

unk0wmn.

Участник
Автор темы
58
24
без автопромокода активация автоматическая где то сливали его но там код закрыт
 

Вложения

  • DellCharsNOAVTOPROMOCODE.lua
    1.2 KB · Просмотры: 15
  • Нравится
Реакции: Funny Rofl

kyrtion

Известный
1,320
485
зачем зациклить если достаточно проследить событие на труп?
 

kyrtion

Известный
1,320
485
Вроде иногда это событие не приходит, и убитый чел просто стоит с 0 хп пару секунд.


local sampev = require('lib.samp.events')
local NoCrashTable = {}
function sampev.onPlayerStreamIn(id)
NoCrashTable[id] = true
end
function sampev.onPlayerStreamOut(id)
if NoCrashTable[id] then
NoCrashTable[id] = nil
end
end
function sampev.onPlayerSync(playerId, data)
if data.health == 0 and NoCrashTable[playerId] then
NoCrashTable[playerId] = nil
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, playerId)
raknetEmulRpcReceiveBitStream(163, bs)
raknetDeleteBitStream(bs)
end
end


Или без таблицы, но может уменьшить время игры без краша. Функции со словом "samp" не любят частого вызова.

function sampev.onPlayerSync(playerId, data)
if data.health == 0 and select(2, pcall(sampGetCharHandleBySampPlayerId, playerId)) then
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, playerId)
raknetEmulRpcReceiveBitStream(163, bs)
raknetDeleteBitStream(bs)
end
end
создание пакета внутри событие желательно создать поток, а потом уже внутри воспроизводить пакет

Lua:
-- modified by kyrtion <3
local sampev = require('samp.events')

local removed = {}

local function isRemovedPlayer(player_id)
  -- safe code?.. protect for reloading script
  if type(removed[player_id]) == 'nil' then
    removed[player_id] = false
  end

  return removed[player_id]
end

local function removePlayer(player_id)
  local bs = raknetNewBitStream()
  raknetBitStreamWriteInt16(bs, player_id)
  raknetEmulRpcReceiveBitStream(163, bs) -- RPC_SCRWORLDPLAYERREMOVE | sampfuncs.lua:143
  raknetDeleteBitStream(bs)
end

local function doesCharExistBySampPlayerId(player_id)
  local exist, _char = sampGetCharHandleBySampPlayerId(player_id)
  return exist
end

function main()
  while not isSampLoaded() or not isSampfuncsLoaded() do wait(100) end
  while not isSampAvailable() do wait(100) end

  wait(-1)
end

function sampev.onPlayerSync(player_id, data)
  if data.health <= 0 then
    lua_thread.create(function()
      if doesCharExistBySampPlayerId(player_id) and not isRemovedPlayer(player_id) then
        removePlayer(player_id)
        removed[player_id] = true
      end
    end)
  end
end

function sampev.onPlayerStreamIn(player_id)
  removed[player_id] = false
end

function sampev.onPlayerStreamOut(player_id)
  if isRemovedPlayer(player_id) then
    removed[player_id] = nil
  end
end
Протестируйте и напишите фидбек, как и что там
 

Вложения

  • test$.lua
    1.3 KB · Просмотры: 1
Последнее редактирование:

kyrtion

Известный
1,320
485
фикс, изменил событие на onPlayerDeath - сервер всех сообщает кто сейчас помер)
добавил проверка в стриме ли - и получится обычный алерт как метод в килл-лист))

1 игрок может флудить пакетом Player Sync 10-50 раз в секунду.
ну и ладно, но чтобы не зациклинило каждые мс в скрипт, а не событие. событие просто ловит и обрабатывает за это сэкономит в ~1 сек
если с проверкой то ничего не будет засорять, по идее должно правильно работать

Lua:
-- modified by kyrtion <3
local sampev = require('samp.events')

local removed = {}

local function isRemovedPlayer(player_id)
  -- safe code?.. protect for reloading script
  if type(removed[player_id]) == 'nil' then
    removed[player_id] = false
  end

  return removed[player_id]
end

local function removePlayer(player_id)
  local bs = raknetNewBitStream()
  raknetBitStreamWriteInt16(bs, player_id)
  raknetEmulRpcReceiveBitStream(163, bs) -- RPC_SCRWORLDPLAYERREMOVE | sampfuncs.lua:143
  raknetDeleteBitStream(bs)
end

local function doesCharExistBySampPlayerId(player_id)
  local exist = sampGetCharHandleBySampPlayerId(player_id)
  return exist
end

function sampev.onPlayerDeath(player_id)
  if not doesCharExistBySampPlayerId(player_id) then return end

  lua_thread.create(function()
    wait(10)
    -- again test exist in stream - protected crash
    if doesCharExistBySampPlayerId(player_id) and sampGetPlayerHealth(player_id) <= 0 and not isRemovedPlayer(player_id) then
      removed[player_id] = true
      removePlayer(player_id)
    end
  end)
end

function sampev.onPlayerStreamIn(player_id)
  removed[player_id] = false
end

function sampev.onPlayerStreamOut(player_id)
  if isRemovedPlayer(player_id) then
    removed[player_id] = nil
  end
end

тестил на samp rp legacy в /tpmp - ОГ, теперь должно работать
 

Вложения

  • test$.lua
    1.4 KB · Просмотры: 4

VanoKLR

Известный
1,117
753
Код:
function sampev.onPlayerDeath(player_id)
    if not doesCharExistBySampPlayerId(player_id) then
        return
    end
    lua_thread.create(function() wait(10)
        if doesCharExistBySampPlayerId(player_id) and sampGetPlayerHealth(player_id) <= 0 and not isRemovedPlayer(player_id) then
            removed[player_id] = true
            removePlayer(player_id)
        end
    end)
end
зачем поток если все ровно есть проверка на существование? зачем проверка на хп если и так все это идет в событии смерти?
local function doesCharExistBySampPlayerId(player_id) local exist = sampGetCharHandleBySampPlayerId(player_id) return exist end

зачем создавать функцию в которой вызывается функция? можно вызвать sampGetCharHandleBySampPlayerId и эффект будет тот же самый
 
  • Нравится
Реакции: fleetxn

kyrtion

Известный
1,320
485
зачем поток если все ровно есть проверка на существование? зачем проверка на хп если и так все это идет в событии смерти?
просто дополнил проверку. можешь убрать хп если не совсем критично. по поводу потока сделано так чтобы вызывало не во время события (будет там хп 32 или 7), а после события (хп становится 0). поставил проверку на существование педа на всякий случай. а может сервер быстрее отправляет пакет чтобы пропадал игрока (вышел, или от сервера заставил пропадать).

зачем создавать функцию в которой вызывается функция? можно вызвать sampGetCharHandleBySampPlayerId и эффект будет тот же самый
на практике обычно пишу по другому название функция чтобы не вызывало вопросов. doesCharExistBySampPlayerId, а именно проверка только пед на стриме без значений педа, самая обычная проверка. если нужно получить пед и проверка на стрим - тогда будет другой разговор.
 

игрок сампа

Участник
118
14
фикс, изменил событие на onPlayerDeath - сервер всех сообщает кто сейчас помер)
добавил проверка в стриме ли - и получится обычный алерт как метод в килл-лист))


ну и ладно, но чтобы не зациклинило каждые мс в скрипт, а не событие. событие просто ловит и обрабатывает за это сэкономит в ~1 сек
если с проверкой то ничего не будет засорять, по идее должно правильно работать

Lua:
-- modified by kyrtion <3
local sampev = require('samp.events')

local removed = {}

local function isRemovedPlayer(player_id)
  -- safe code?.. protect for reloading script
  if type(removed[player_id]) == 'nil' then
    removed[player_id] = false
  end

  return removed[player_id]
end

local function removePlayer(player_id)
  local bs = raknetNewBitStream()
  raknetBitStreamWriteInt16(bs, player_id)
  raknetEmulRpcReceiveBitStream(163, bs) -- RPC_SCRWORLDPLAYERREMOVE | sampfuncs.lua:143
  raknetDeleteBitStream(bs)
end

local function doesCharExistBySampPlayerId(player_id)
  local exist = sampGetCharHandleBySampPlayerId(player_id)
  return exist
end

function sampev.onPlayerDeath(player_id)
  if not doesCharExistBySampPlayerId(player_id) then return end

  lua_thread.create(function()
    wait(10)
    -- again test exist in stream - protected crash
    if doesCharExistBySampPlayerId(player_id) and sampGetPlayerHealth(player_id) <= 0 and not isRemovedPlayer(player_id) then
      removed[player_id] = true
      removePlayer(player_id)
    end
  end)
end

function sampev.onPlayerStreamIn(player_id)
  removed[player_id] = false
end

function sampev.onPlayerStreamOut(player_id)
  if isRemovedPlayer(player_id) then
    removed[player_id] = nil
  end
end

тестил на samp rp legacy в /tpmp - ОГ, теперь должно работать
параша какая-то. для чего хранить удаленных игроков, для чего эмулировать рпс?

function hideDeathChars()
while true do
for id = 0, sampGetMaxPlayerId(true) do
local result, ped = sampGetCharHandleBySampPlayerId(id)
if result then
if isCharDead(ped) then
if cfg.hideDeathChars then deleteChar(ped) end
end
end
end
wait(200)
end
end
 

Funny Rofl

Известный
119
244
параша какая-то. для чего хранить удаленных игроков, для чего эмулировать рпс?

function hideDeathChars()
while true do
for id = 0, sampGetMaxPlayerId(true) do
local result, ped = sampGetCharHandleBySampPlayerId(id)
if result then
if isCharDead(ped) then
if cfg.hideDeathChars then deleteChar(ped) end
end
end
end
wait(200)
end
end
Так этот код тоже не идеальный.

Если удалять без рпц, то зачем тогда перебирать айди.

while true do
for _, p in pairs(getAllChars()) do
if p ~= PLAYER_PED and isCharDead(p) then
deleteChar(p)
end
end
wait(0)
end

Но удалять игроков с помощи deleteChar() вроде бы нельзя, так как для систем Сампа эти игроки не будут удалены. Будут глюки, фантомные метки игроков на радаре, и т.д.
 
Последнее редактирование:
  • Влюблен
Реакции: unk0wmn.

игрок сампа

Участник
118
14
Так этот код тоже не идеальный.

Если удалять без рпц, то зачем тогда перебирать айди.

while true do
for _, p in pairs(getAllChars()) do
if p ~= PLAYER_PED and isCharDead(p) then
deleteChar(p)
end
end
wait(0)
end

Но удалять игроков с помощи deleteChar() вроде бы нельзя, так как для систем Сампа эти игроки не будут удалены. Будут глюки, фантомные метки игроков на радаре, и т.д.
использую этот код и никакой фантомной хуйни нет