Перейти к содержанию

Electr0

Администраторы
  • Постов

    10 396
  • Зарегистрирован

  • Посещение

  • Победитель дней

    417

Весь контент Electr0

  1. Что то не правильно работает, вот эту убегу: Раздестроили в это состояние три телепорт танка.
  2. Значение Статус изменено на: В обработке
  3. Если раньше в первой версии (см первый комментарий) все было проще, а так же вместо Client в названии событий было Entity, то теперь чтение событий от плагина выглядит вот так: public void OnStartClientStuck(int client, int[] iEntities, int iCountEntities) { PrintToChatAll("OnStartClientStuck(%N, iCountEntities %i)", client, iCountEntities); // Если кол-во пропов мешающих игроку больше нуля, читаем данные из массива. if (iCountEntities > 0) { int entity; for (int i = 0; i < iCountEntities; i++) { entity = iEntities[i]; if (entity && (entity = EntRefToEntIndex(entity)) != INVALID_ENT_REFERENCE && IsValidEntity(entity)) { PrintToChatAll("OnStartClientStuck:: iEntities[%i] %i", i, iEntities[i]); } } } } public void OnClientStuck(int client, int[] iEntities, int iCountEntities) { PrintToChatAll("OnClientStuck(%N, iCountEntities %i)", client, iCountEntities); // Если кол-во пропов мешающих игроку больше нуля, читаем данные из массива. if (iCountEntities > 0) { int entity; for (int i = 0; i < iCountEntities; i++) { entity = iEntities[i]; if (entity && (entity = EntRefToEntIndex(entity)) != INVALID_ENT_REFERENCE && IsValidEntity(entity)) { PrintToChatAll("OnClientStuck:: iEntities[%i] %i", i, iEntities[i]); } } } } public void OnClientEndStuck(int client) { PrintToChatAll("OnClientEndStuck(%N)", client); }
  4. Значение Статус изменено на: Тестируется
  5. Готово, пришлось обновить только созданный плагин (см. последние коментарии): Вот стопка предметов в которые будет помещен танк: Помещаем танка и ждем 0.5 сек: А вот что случилось через пол секунды:
  6. Готово, во время первой трассировки понимаю застревает или нет клиент, если да то делаю вторичную трассировку со сбором пропов в которых клиент застрял и оформляю это все в ArrayList записывая пропы через PushArrayCell в EntRef формате, дальше на этапе создания событий OnClientStartStuck и OnClientStuck я извлекаю данные из ArrayList и помещаю их в обычный числовой массив который уже через параметр Param_Array можно передать событию, не забывая указать кол-во ячеек в массиве, дальше в плагинах которые слушают события OnClientStartStuck, OnClientStuck можно получить полный список пропов которые мешают игроку двигатся в конкретный момент.
  7. Есть проблема, т.к. плагин передает за раз только один проп, то плагин исправления застревания, если клиент застрял в сотнях предметов работает не мгновенно, а с задержкой в 0.5 сек и шагом 1 предмет - 0.5 сек, то есть. если поставить кучу предметов и сунуть туда танка, то он будет раз в 0.5 сек убирать предмет мешающий танку, думаю надо подумать как его ускорить, надо как-то научится за один раз передавать данные обо всех предметах что мешают игроку, тогда это будет то что нужно, и можно будет за раз хоть 200 предметов двинуть.
  8. Значение Статус изменено на: В обработке
  9. т.к. плагин исправления застревания работает не мгновенно, а с задержкой в 0.5 сек и шагом 1 предмет 0.5 сек, то есть. если поставить кучу предметов и сунуть туда танка, то он будет раз в 0.5 сек убирать предмет мешающий танку, думаю надо подумать как его ускорить, надо как-то научится за один раз передавать данные обо всех предметах что мешают игроку, тогда это будет то что нужно, и можно будет за раз хоть 200 предметов двинуть.
  10. Значение Статус изменено на: Исправлено
  11. Значение Статус изменено на: Исправлено
  12. Значение Статус изменено на: Исправлено
  13. Explosions In The Sky – It's Natural to Be Afraid

  14. Значение Статус изменено на: Тестируется
  15. то как система работает в действии конечно угарно) телепортируешь танка или кого нить живого ну на вроде куры в стопку пропов чтобы он там застрял и пропы в которых он застрял сами поднимаются над ним давая ему пройти.
  16. По такому принципу идет расчет, после того как узнал высоту самого низкого края предмета. // если самый низкий угол выше либо равен высоте предмета (99.9 % что нет, но все же если такое произойдет то у логики не должно быть исключений) if (vLowestEdgeZ >= fVecEntPos[2]) { // приравниваем высоту предмета к высоте над головой игрока. fVecEntPos[2] = fVecPlayerPos[2] += vPlayerMaxs[2] + 10.0; DispatchKeyValueVector( entity, "Origin", fVecEntPos ); } else { // высота выше либо равной которой должен быть самый низкий край предмета (это позиции ног + рост игрока + 10 юнитов) fVecPlayerPos[2] += vPlayerMaxs[2] + 10.0; // вычитаю из самого низкого края, высоту выше которой должен быть самый низкий край, получаю кол-во юнитов на которое надо поднять проп. float vUnitsToMoveUP = vLowestEdgeZ - fVecPlayerPos[2]; // если число получилось отрицательное делаю его положительным. if (vUnitsToMoveUP < 0.0) { vUnitsToMoveUP = -vUnitsToMoveUP; } // прибавляю к оси Z предмета кол-во юнитов на которое надо поднять предмет. fVecEntPos[2] += vUnitsToMoveUP; DispatchKeyValueVector( entity, "Origin", fVecEntPos ); }
  17. При застревании игрока или танка в пропе, предлагаю узнавать самую низкую точку предмета (мы же понимаем что ориентироватся на центр нет смысла, ты повернешь проп вниз и получится так что его центр будет вверху но игрок всеравно в нем застревает)), поэтому нужно узнать высоту крайне низкой точки предмета и сравнив ее с высотой игрока понять насколько юнитов нужно телепортнуть предмет вверх
  18. Значение Статус изменено на: Тестируется
  19. это хорошо работает на прямоугольных вытянутых предметах.
  20. Значение Статус изменено на: Тестируется
  21. Значение Статус изменено на: Тестируется
  22. проблемка, урон от смокера идет раз в секунд как оказалось, тактику меняем, если игрока курят застрявшим, на событии OnEntityStartStuck делаем старт личного повторяющегося таймера урона на 1 сек который будет принудительно закрыт во время события OnEntityEndStuck
  23. надо использовать OnEntityStuck который стреляет раз в 0.5 сек, поставить условие если человек скурен то давать ему лещей с вот такими параметрами по Damage, и damagetype, Inflictor OnTakeDamage(victim 1, Attacker 7, Inflictor 7 (player), Damage 10.000000, damagetype 1048576)
  24. public void OnEntityStartStuck(int client, int entity) { PrintToChatAll("OnEntityStartStuck(%N, %i)", client, entity); } public void OnEntityStuck(int client, int entity) { PrintToChatAll("OnEntityStuck(%N, %i)", client, entity); } public void OnEntityEndStuck(int client) { PrintToChatAll("OnEntityEndStuck(%N)", client); } OnClientStartStuck, и последующие OnClientStuck через промежудки проверки, Проп убран, выстреливает OnClientEndStuck
×
×
  • Создать...