DataPack и выход за пределы количества операций.

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Добрый день.Подскажите,пожалуйста,почему идет ошибка со стороны сервера,хотя по идее все реализовано правильно?
L 01/22/2020 - 22:30:09: [SM] Exception reported: Data pack operation is out of bounds.
L 01/22/2020 - 22:30:09: [SM] Blaming: smrpg/upgrades/smrpg_poison_scout_test.smx
L 01/22/2020 - 22:30:09: [SM] Call stack trace:
L 01/22/2020 - 22:30:09: [SM] [0] DataPack.ReadCell
L 01/22/2020 - 22:30:09: [SM] [1] Line 131, D:\����������\addons\sourcemod\scripting\smrpg_poison_scout_test.sp::TimerHurt
 

Вложения

  • Скриншот 22-01-2020 221725.png
    Скриншот 22-01-2020 221725.png
    25 КБ · Просмотры: 92
  • Скриншот 22-01-2020 222641.png
    Скриншот 22-01-2020 222641.png
    16.7 КБ · Просмотры: 88

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
Добрый день.Подскажите,пожалуйста,почему идет ошибка со стороны сервера,хотя по идее все реализовано правильно?
L 01/22/2020 - 22:30:09: [SM] Exception reported: Data pack operation is out of bounds.
L 01/22/2020 - 22:30:09: [SM] Blaming: smrpg/upgrades/smrpg_poison_scout_test.smx
L 01/22/2020 - 22:30:09: [SM] Call stack trace:
L 01/22/2020 - 22:30:09: [SM] [0] DataPack.ReadCell
L 01/22/2020 - 22:30:09: [SM] [1] Line 131, D:\����������\addons\sourcemod\scripting\smrpg_poison_scout_test.sp::TimerHurt
я понял.
1579766732732.png

в CreateDataTimer датапак пересоздается пустым.
просто не инициализируй датапак

C++:
DataPack hPack;
CreateDataTimer(..., hPack, ...);

// Тут добаваляешь в него данные
 
Последнее редактирование:

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
я понял.
Посмотреть вложение 51357
в CreateDataTimer датапак пересоздается пустым.
просто не создавай датапак

C++:
DataPack hPack;
CreateDataTimer(..., hPack, ...);

// Тут добаваляешь в него данные
Угу,спасибо.
Еще сразу переместил все hPack.WriteCell под таймер на всякий случай.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Когда получаешь индекс игрока через GetClientOfUserId(), то добавлять проверку IsClientInGame() нет никакой необходимости (если игрок не в игре, то индекс у игрока будет равен 0).
 

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Когда получаешь индекс игрока через GetClientOfUserId(), то добавлять проверку IsClientInGame() нет никакой необходимости (если игрок не в игре, то индекс у игрока будет равен 0).
Хорошо,спасибо за совет.
Мне вот интересно другое.Как мне бесконечный цикл убрать.Ибо сейчас происходит так,что плагин срабатывает 1 раз,а дальше ничего не делает😃
 

komashchenko

Идиот
Сообщения
916
Реакции
2,570
Когда получаешь индекс игрока через GetClientOfUserId(), то добавлять проверку IsClientInGame() нет никакой необходимости (если игрок не в игре, то индекс у игрока будет равен 0).
Бывают случаи что он не в игре, поэтому доп проверка не помешает
 

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Бывают случаи что он не в игре, поэтому доп проверка не помешает
Хотел об этом написать,но передумал.Игрок же может выйти в этот момент,хотя все происходит настолько быстро,что это надо словить такой момент.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Игрок же может выйти в этот момент
все операции в плагине происходят за один тик, если не использован таймер
Сообщения автоматически склеены:

Мне вот интересно другое.Как мне бесконечный цикл убрать.Ибо сейчас происходит так,что плагин срабатывает 1 раз,а дальше ничего не делает
Ты бы постил код текстом, а не картинкой.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #9
Когда получаешь индекс игрока через GetClientOfUserId(), то добавлять проверку IsClientInGame() нет никакой необходимости (если игрок не в игре, то индекс у игрока будет равен 0).
у меня в ксго бывало что индекс из юзер ид получило, а игрок вне игры. С тех пор тоже ставлю IsClientInGame.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Кстати, а для чего ты возвращаешь Plugin_Stop?
Насколько я понимаю у тебя таймер в любом случае один раз только сработает, хоть и поставил ему флаг повторяющегося
 

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Кстати, а для чего ты возвращаешь Plugin_Stop?
Насколько я понимаю у тебя таймер в любом случае один раз только сработает, хоть и поставил ему флаг повторяющегося
Насильно останавливаю работу плагина где только можно,ибо,как было замечено Player_hurt и SDKHOOK_Damage создают практически бесконечный цикл(пока тот кого вы бьете не умрет).
И кстати.Этот цикл почему-то проходит проверку на оружие.
Сообщения автоматически склеены:

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

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Этот цикл почему-то проходит проверку на оружие.
Потому что при использовании SDKHooks_TakeDamage() дамаг наносится тем оружием, что в руках у игрока.
А игрок не переключается с него.
 

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Тогда такой вопрос.А можно ли как-нибудь от лица таймера отослать фейковое событие,что игрок якобы умер,но на самом деле он будет жив.
 

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Я не дописал,что это надо было еще и сервер обмануть.Фейковое сообщение отправить можно и это легко,а вот иначе.
Хотя уже не надо.Я вроде нашел хороший способ,который работает:3
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
В чём смысл пересоздавать DataPack с полностью идентичными параметрами, если можно просто вернуть Plugin_Continue.
Хендл DataPack-а закроется самостоятельно, т.к. CreateDataTimer возводит флаг TIMER_DATA_HNDL_CLOSE.
Это случится как только будет уничтожен таймер - либо при встрече с Plugin_Stop, либо при смене карты, т.к. указан флаг TIMER_FLAG_NO_MAPCHANGE.

И так к слову, у вас переопределяется тип переменной hPack. Видимо, компилятор пропустил эту ошибку.
 
Сверху Снизу