Контакты Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Защита на респауне. (Плагин защищает игрока от повреждений на респауне.)
Защита на респауне.
Sunday Дата: Пятница, 02.11.2012, 15:57:39 | Сообщение # 1
Сообщений: 186
Репутация: 24 [ +/- ]
Здравствуйте много уважаемые форумчане!

Как всем известно и горько осознавать что Вальве достали всех своими обновлениями.)))

После последнего обновления на сервере перестало работать несколько важных плагинов (metamod), неделю ожиданий от авторов пофиксить свои творения, закончились увы без успешно, полагаю они давно забили на свой продукт. Перештрудив мною интернет просторы, я не нашел то что нужно для см, моей целью состоит сделать усовершенствованный аналог для (sourcemod) и собственно по этому возникла эта замечательная тема! klas

Начал писать (в кавычках) код на своем кривом пауне и вот что получается (Добавил общие описания рядом с функциями в виде PrintToChat, что бы было наглядно понятно, если кто захочет вставить и проверить на сервере):

Code

#include <sourcemod>

new clientProtected[MAXPLAYERS+1];
new clientHP[MAXPLAYERS+1];

public OnPluginStart()
{
              HookEvent("player_spawn", Event_PlayerSpawn);
              HookEvent("player_hurt", Event_PlayerHurt);
}              

public Event_PlayerSpawn(Handle:event,const String:name[],bool:dontBroadcast)
{
              new client = GetClientOfUserId(GetEventInt(event, "userid"));

              if(IsClientConnected(client) && IsClientInGame(client))
              {
               clientHP[client] = GetClientHealth(client);
               PrintToChat(client, "Даем безсмертие!");
              }

              //Включает защиту на клиенте
              clientProtected[client] = 1;
              PrintToChat(client, "Вкл. защиту!");

              CreateTimer(3.0, timer_PlayerProtect, client);
}

//Если игрок получает урон во время защиты то его здоровье восстанавливается.
public Event_PlayerHurt(Handle:event,const String:name[],bool:dontBroadcast)
{
              new client = GetClientOfUserId(GetEventInt(event, "userid"));

              if (clientProtected[client] == 1)
               {
                SetEntData(client, FindDataMapOffs(client, "m_iMaxHealth"), clientHP[client], 4, true);
                SetEntData(client, FindDataMapOffs(client, "m_iHealth"), clientHP[client], 4, true);
                PrintToChat(client, "\x04Здоровье восстановлено!");
               }
}

//Защита игрока истекает.
public Action:timer_PlayerProtect(Handle:timer, any:client)
{
              //Отключает защиту у игрока
              clientProtected[client] = 0;
              PrintToChat(client, "Защита отк!");
}


И это отлично работает!
Так вот, у меня получается сделать защиту только на время после респауна, определенное время как игрок возродился он в защите, в данном случае это 3 секунды и это не правильно, потому что даже при динамичной ДМ игре, например в килбоксовой карте это плохо работает, игрок 3 секунды бессмертный и собственно может делать что душе угодно и даже если ставить меньше то ни к какому адекватному смыслу это не приводит.

Изменения:

1. Главная задача сделать так, когда игрок отреспаунился то он находиться в защите но как только стоило ему пошевелиться (сделать шаг или выстрел) то защита отключается. (игрок сможет осмотреться, на практике это важно). Это самый важный пункт, (я не хочу что бы мне тут давалось все на блюдечки), и по этому подумав как можно это сделать, пришел к выводу что нужно вначале определить точку координат игрока, когда он не подвижный и только отреспаунился и если это точка координат изменилась (игрок пошевелился) то защита снимается, надеюсь вы поможете в этом! Функция отвечающая за координаты я полагаю GetClientAbsOrigin.

2. Когда игрок находится в защите то на нем NoBlock, собственно как он пошевелится то NoBlock снимается (Это очень полезно, например игрок появляется на респе а в этот момент другой игрок пробегает в этой точке, собственно они застревают в друг друге или на некоторых картах точки респауна заслоняют проход или например бывают карты с небольшим кол-м точек респа и если это добавить в плагин, то проблема сама собой исчезнет не понадобится мучиться и справлять карту или того хуже
, ставить доп плагины что бы это исправить).

п.с.
Я нашел скрипт от многоуважаемого _Ws_ вот в этой теме, которая позволяет взять координаты GetCoords v1.2 возможно это поможет разобраться как лучше это сделать, единственное чего я не могу, это склепать все свои идеи за неимением достаточного опыта, надеюсь в этом мне помогут грамотные люди!


Прилагаю ниже скрипт.

Добавлено (02.11.2012, 15:57:39)
---------------------------------------------
Второй пункт сделал. НоБлок вкл и выкл на респауне. Оказалось проще простого, остается первый пункт, самый ключевой.

Прикрепления: scp.sp(1.5 Kb)


Сообщение отредактировал Sunday - Пятница, 02.11.2012, 17:07:08
 
Scarface_slv Дата: Пятница, 02.11.2012, 18:06:43 | Сообщение # 2
Сообщений: 738
Репутация: 61 [ +/- ]
Есть у Ws такой плагин AFKPingControl возми от туда пример, там есть проверка если игрок не двигается определённое время его кикает, вместо кика, снимаешь защиту...
 
Sunday Дата: Пятница, 02.11.2012, 19:36:44 | Сообщение # 3
Сообщений: 186
Репутация: 24 [ +/- ]
Спасибо Scarface_slv за информацию, попробую, если _Ws_ не против.

Добавлено (02.11.2012, 19:36:44)
---------------------------------------------
И все таки не вышло, есть еще идеи?



Сообщение отредактировал Sunday - Пятница, 02.11.2012, 18:55:02
 
Scarface_slv Дата: Суббота, 03.11.2012, 01:09:20 | Сообщение # 4
Сообщений: 738
Репутация: 61 [ +/- ]
У меня все вышло и получился плагин:
1.Если не двигаешься защита игрока включена.
2.Если сдвинешься с места защита выключается.
3.И если начнешь стрелять защита выключится.
Если что то не так подправь в исходнике=)

Прикрепления: protect-spawn.rar(4.2 Kb)
 
Sunday Дата: Суббота, 03.11.2012, 07:44:12 | Сообщение # 5
Сообщений: 186
Репутация: 24 [ +/- ]
Scarface_slv очень здорово klas но в моем случае скрипт не работает dumaem , дальше Event_PlayerSpawn, еще одна особенность, в моей игре нет эвента weapon_fire pipec , он исключительно для КонтрСтрайк и полагаю что годмоде m_takedamage, хотелось бы более гибкий вариант, основанный на примере выше, если Вас не затруднит?


Сообщение отредактировал Sunday - Суббота, 03.11.2012, 09:00:37
 
Scarface_slv Дата: Суббота, 03.11.2012, 13:42:10 | Сообщение # 6
Сообщений: 738
Репутация: 61 [ +/- ]
Странная игра у тебя.
И этот плаг наверно лучше сделать на время например прошло 5 сек и защита снимается, если он не сдвинулся)
а сейчас защита снимается только если сдвинется или в кого ни будь попадет=)

Прикрепления: spawn-protect.sp(2.4 Kb)
 
Sunday Дата: Суббота, 03.11.2012, 15:26:37 | Сообщение # 7
Сообщений: 186
Репутация: 24 [ +/- ]
Scarface_slv спасибо за попытку, к сожалению не работает. Игра Half Life 2 Deathmatch. Как раз таки тот что скрипт у меня получился, он на время прекрасно работает, в нем все реализовано но это бред, потому что при появлении, игрок сразу начинает стрелять в ближайшую цель и в ответ не получает урона, поскольку еще держится бессмертие, по этому хочется реализовать таким образом, как только игрок двинулся то защита снимается.

как я понял, проблема в этих строках у тебя в скрипте.
Code

  if (timers[client] != INVALID_HANDLE)
  {
   KillTimer(timers[client]);
   timers[client] = INVALID_HANDLE;
  }
  if(IsPlayerAlive(client) && GetClientTeam(client) > 1)
  {
   Heal_on[client]=true;
   CreateTimer(0.5, Timer_Func, client);
  }


Сообщение отредактировал Sunday - Суббота, 03.11.2012, 15:37:16
 
Scarface_slv Дата: Суббота, 03.11.2012, 16:26:13 | Сообщение # 8
Сообщений: 738
Репутация: 61 [ +/- ]
Я незнаю я кроме css v34 нигде не могу проверить, больше вариантов нет)
И врятли там проблема, всего лишь проверяет запущен ли таймер, если да удаляет(вдруг рестарт...), и проверяет жив ли игрок и находиться ли в команду Т или КТ, потому что при подключение игрока вызывается функция player_spawn
таймер 0.5 это для того что бы подождать, пока игрок приземлиться на землю, потому что обычно игроки появляются на высоте, да и работает на 34 отлично, в других версиях игры я не разбираюсь, да и не нужно мне)
И если игрок сдвинется защита снимается и при стрельбе тоже снимается, думай сам как реализовать в DM)
 
Sunday Дата: Суббота, 03.11.2012, 19:47:26 | Сообщение # 9
Сообщений: 186
Репутация: 24 [ +/- ]
все правильно, обязательно последую твоему совету, буду думать dumaem )))). Сделал почти то что надо но есть одно но! Игрок появляется, защита включается, если в него выстрелить и следом сразу еще совершить один выстрел то игрок сразу дохнет, в чем может быть проблема? Когда к примеру сделаешь выстрел из пистолетика, подождешь с пол секунды и далее стреляешь то все норм но когда моментально стреляешь то игрок сразу дохнет выйдя из защиты от следующей пули... Бросишь гранату то все нормально, не наносится урон, падает защита конечно но над этим буду думать дальше, интересует то, из за чего если сразу стреляешь очередью то дохнет сразу...(димагогия блин)) Опять же если не затруднит, приложил скрипт, посмотри пожалуйста своим более грамотным взглядом. ulibka

Прикрепления: v4.sp(1.7 Kb)
 
Scarface_slv Дата: Суббота, 03.11.2012, 20:13:40 | Сообщение # 10
Сообщений: 738
Репутация: 61 [ +/- ]
Незнаю... жди WS он намного лучше понимает pawn=)
 
Sunday Дата: Суббота, 03.11.2012, 20:37:25 | Сообщение # 11
Сообщений: 186
Репутация: 24 [ +/- ]
звучит как приговор... grust
ладно, буду пробывать, если что то будет получаться то сразу буду писать сюда.
Надеюсь кто ни будь а может Ws напишет, в чем я не много сомневаюсь. dumaem
 
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Защита на респауне. (Плагин защищает игрока от повреждений на респауне.)
  • Страница 1 из 1
  • 1
Поиск: