Серьезно?
Плагин рассчитан на то, что после оживления игрок будет на грани смерти, он таким и становится, что при оживлении игрок на грани смерти, и при падении после оживления он умрет.
Так что, с новой версией ничего менять не нужно. Игрок будет иметь лишь одно падение после оживления дефибом.
Он не меняет количество падений после дефиба, а выставляет количество текущих падений при оживлении игрока.
Извиняюсь, если не правильно понял сообщение, но я попробовал добавить в конфиг квару sm_cvar survivor_max_incapacitated_count 1 и проверил — она меняет общее кол-во инкапов, не зависимо от причины. Т. е. не важно, с дефиба игрока оживили или открыли его, у всех игроков будет указанное в этой кваре кол-во инкапов до ЧБ экрана.
В общем, я открыл 2 исходника и перенёс логику с кол-вом инкапов из старой версии в новую. Вроде, операция прошла успешно : ) Там синтаксис отличался, но по аналогии удалось добавить переменную с кол-во инкапов, значение которой назначается игроку после оживления с дефиба в Event_PlayerDefibed:
int MaxIncaps = GetConVarInt(FindConVar("survivor_max_incapacitated_count"));
SetEntProp(iSubject, Prop_Send, "m_currentReviveCount", (MaxIncaps - GetConVarInt(hg_RemainingIncaps)));
if (GetEntProp(iSubject, Prop_Send, "m_currentReviveCount") == MaxIncaps) {
SetEntProp(iSubject, Prop_Send, "m_isGoingToDie", 1);
SetEntProp(iSubject, Prop_Send, "m_bIsOnThirdStrike", 1);
}
В итоге, теперь можно сделать так, что у игроков как обычно 2 инкапа до ЧБ, а вот после оживления с дефиба у игрока будет 1 инкап до ЧБ.
Доработанный исходник во вложении.
Вопрос с B&W on Defib решён, осталось разобраться с Loot of Zombies и Bile the World.
Версия v1.8 это последняя версия от автора Jonny) Чем отличие от v1.6 я не могу сказать так как не сравнивал их.
Я только перевел по сути на новый syntax когда переходил на Sourcemod 1.8 больше изменений я там не делал
Версия v2.6 (на данный момент) это уже переписанная версия под моим авторством. От оригинала там остался только шаблон по рандомному выпадению вещей.
Чем отличается:
1. Старый оригинальный v1.8 состоит из 2809 строк кода (это если сравнивать с тем что я обновил). Версия v2.6 из 1665 строк кода.
2. Изменен метод стауна вещей, так же исправлена проблема когда вещи застревали в текстурах или улетали за карту.
3. Добавлена поддержка выпадания оружия разных видов скинов (например: золотой лом и все что добавили после последнего DLC). А так же рандомное изменение патронов (например выпал Ak47 а там может быть с 0 патронов до полного комплекта)
4. Добавлены классы по лимиту, чтобы топ оружие не падало через каждого босса.
добавил новый cvar
l4d2_bile_the_world_boomer_death_vomit 1
1 - Только живые (по умолчанию)
2 - Только ведьма и танк
3 - Все
Там заблев делается в двух вариантах
1. От смерти толстого и 2 от уничтожение объекта (то есть при взрыве живота)
Добавил только в событие взрыва живота, по идеи этого достаточно должно быть.
Сам код не проверял, так что могу ошибиться в правильности кода
Судя по описанию, версия v2.6 Loot of Zombies переработана капитально, можно с ней ознакомиться? Есть ссылка на гит?
Спасибо за помощь с Bile the World, но, не сработало. Сначала не работало, потому что новая квара была логического типа, я её изменил на целочисленную. Потом понял, что не работает потому, что её проверка происходит в методе для игроков, а не заражённых.
В общем, я начал опытным путём менять условия с заражёнными, но застрял на том, что не знаю как правильно называются классы заражённых.
Всё происходит в методе VomitSplash:
void VomitSplash(bool BoomerDeath, float pos[3], int client)
{
...
if (BoomerDeath)
{
...
char class[STRINGLENGTH_CLASSES];
int maxents = GetMaxEntities();
for (int i = MaxClients+1; i <= maxents; i++)
{
if (!IsValidEdict(i)) continue;
GetEdictClassname(i, class, sizeof(class));
if (strcmp(class, CLASS_ZOMBIE) != 0 && strcmp(class, CLASS_WITCH) != 0) continue;
SetClientEyePosition(i, targetpos);
if (GetVectorDistance(pos, targetpos) > g_fBoomerDeath_Radius || !IsVisibleTo(pos, targetpos))
{
continue;
}
L4D2_Infected_OnHitByVomitJar(i, client);
}
}
...
}
Здесь проверка, что объект, которого задел взрыв бумера, является классом CLASS_ZOMBIE _И_ классом CLASS_WITCH. Почему тут ведьма отдельно мне не понятно и если вместо них добавлять условие типа:
if (StrEqual(class, "hunter") || (StrEqual(class, "charger") || (StrEqual(class, "tank") ) { ...
То ничего не работает. Также пробовал:
GetEntProp(i, Prop_Send, ENTPROP_ZOMBIE_CLASS) == 8
Тоже не сработало и я не смог найти API по L4D2, где были бы перечислены классы заражённых, их индексы и т. п. Нашёл только ивенты и энтити, а где тут найти перечень классов, переменных заражённых?
Как в вышеуказанном участке кода корректно написать условие, что если объект, которого задел взрыв бумера, является хантером ИЛИ танком ИЛИ громом и т. д. с перечислением всех особых, чтобы можно было по необходимости убирать/добавлять нужных?
Сообщение отредактировал Mos: 29 Октябрь 2022 - 15:02