Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

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

  • Страница 1 из 1
  • 1
Запрет или удаление лишних боеприпасов
In-com_Software Дата: Пятница, 13.12.2013, 18:20:34 | Сообщение # 1
Сообщений: 17
Репутация: 0 [ +/- ]
Здравствуйте! Проблемка такова: при написании в чат !ammo игрок получает полный комплект патронов ко всему оружию, но если тот же игрок еще раз (или несколько раз) напишет !ammo то лишние патроны не принимаются и естественно разлетаются по сторонам, при этом они не исчезают и респаунятся grust
Кто знает, как можно данную функцию отключить или заблокировать.
ЗЫ: Патроны даются игроку через GivePlayerItem(client, "item_патроны_к_оружию");. Если есть другой способ получения патронов с лимитом, буду благодарен.

 
Sunday Дата: Суббота, 14.12.2013, 04:14:46 | Сообщение # 2
Сообщений: 186
Репутация: 24 [ +/- ]
GivePlayerItem возможно не совсем подходит для этой цели, поскольку есть заданный лимит кол-ва боеприпасов и разумеется они будут сыпаться мимо, все верно, к тому же это приведет к краху сервера в конечном итоге или как минимум к диким лагам.

Накидал тебе несколько вариантов, на форуме сама функция уже обсуждалась и можно конечно сделать так:

Вариант 1:
Код
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>

public OnPluginStart()
{
  RegConsoleCmd("sm_ammo", Command_Ammo);
}

public Action:Command_Ammo(client, args)
{
  if (IsClientInGame(client) && client != 0)
  {
   SetWeaponItem(client, "weapon_pistol", 18, 150, -1);
   SetWeaponItem(client, "weapon_357", 6, 12, -1);
   SetWeaponItem(client, "weapon_smg1", 45, 225, 1);
   SetWeaponItem(client, "weapon_ar2", 30, 60, 3);
   SetWeaponItem(client, "weapon_shotgun", 6, 30, -1);
   SetWeaponItem(client, "weapon_crossbow", 1, 10, -1);
   SetWeaponItem(client, "weapon_frag", -1, 3, -1);
   SetWeaponItem(client, "weapon_rpg", -1, 3, -1);
   SetWeaponItem(client, "weapon_slam", -1, -1, 5);
  }
}

stock SetWeaponItem(client, const String:classname[], q, w, e)
{
  new m_hMyWeapons = FindSendPropOffs("CBasePlayer", "m_hMyWeapons");
  new Offset = FindDataMapOffs(client, "m_iAmmo");
  new index = CreateEntityByName("game_player_equip");

  if (index < 1) return;

  DispatchKeyValue(index,    classname, "1");
  DispatchSpawn(index);
  ActivateEntity(index);
  AcceptEntityInput(index, "use", client);
  AcceptEntityInput(index, "kill");
  for(new i = 0, weapon; i < 128; i += 4)
  {
   weapon = GetEntDataEnt2(client, m_hMyWeapons + i);

   if(IsValidEdict(weapon) && IsValidEntity(weapon))
   {
    decl String:ClassWeapon[32]; ClassWeapon[0] = '\0';
    GetEdictClassname(weapon, ClassWeapon, sizeof(ClassWeapon));
    if (weapon > 0 && strcmp(ClassWeapon, classname, false) == 0)
    {
     new m_iClip1 = GetEntProp(weapon, Prop_Data, "m_iClip1");
     new ammotype = GetEntProp(weapon, Prop_Data, "m_iPrimaryAmmoType");
     new ammotype2 = GetEntProp(weapon, Prop_Data, "m_iSecondaryAmmoType");
     new m_iPrimaryAmmoType = GetEntData(client, Offset + ammotype * 4, 4);
     new m_iSecondaryAmmoType = GetEntData(client, Offset + ammotype2 * 4, 4);
     if (m_iClip1 >= 0)
      SetEntProp(weapon, Prop_Data, "m_iClip1", q);
     if (m_iPrimaryAmmoType >= 0)
      SetEntData(client, Offset + ammotype * 4, w, 4, true);
     if (m_iSecondaryAmmoType >= 0)
      SetEntData(client, Offset + ammotype2 * 4, e, 4, true);
    }
   }
  }
}


Но все таки было бы эстетичнее давать то оружие которое игрок предпочитает(держит в руках) по этому осмелюсь предложить еще один вариант:

Вариант 2:
Код
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>

public OnPluginStart()
{
  RegConsoleCmd("sm_ammo", Command_Ammo);
}

public Action:Command_Ammo(client, args)
{
  if (IsClientInGame(client) && client != 0)
   GetActiveWeapon(client);
}

stock GetActiveWeapon(client)
{
  new m_hActiveWeapon = GetEntPropEnt(client,Prop_Send,"m_hActiveWeapon");
  new String:classname[64]; classname[0] = '\0';

  if(IsValidEntity(m_hActiveWeapon) && IsValidEdict(m_hActiveWeapon))
  {
   GetEdictClassname(m_hActiveWeapon, classname, sizeof(classname));
   if(StrEqual(classname, "weapon_physcannon") || (StrEqual(classname, "weapon_crowbar") || (StrEqual(classname, "weapon_stunstick"))))
    return;
   else if(StrEqual(classname, "weapon_pistol"))
    SetWeaponItem(client, "weapon_pistol", 18, 150, -1);
   else if(StrEqual(classname, "weapon_357"))
    SetWeaponItem(client, "weapon_357", 6, 12, -1);
   else if(StrEqual(classname, "weapon_smg1"))
    SetWeaponItem(client, "weapon_smg1", 45, 225, 1);
   else if(StrEqual(classname, "weapon_ar2"))
    SetWeaponItem(client, "weapon_ar2", 30, 60, 3);
   else if(StrEqual(classname, "weapon_shotgun"))
    SetWeaponItem(client, "weapon_shotgun", 6, 30, -1);
   else if(StrEqual(classname, "weapon_crossbow"))
    SetWeaponItem(client, "weapon_crossbow", 1, 10, -1);
   else if(StrEqual(classname, "weapon_frag"))
    SetWeaponItem(client, "weapon_frag", -1, 3, -1);
   else if(StrEqual(classname, "weapon_rpg"))
    SetWeaponItem(client, "weapon_rpg", -1, 3, -1);
   else if(StrEqual(classname, "weapon_slam"))
    SetWeaponItem(client, "weapon_slam", -1, -1, 5);
  }
}

stock SetWeaponItem(client, const String:classname[], q, w, e)
{
  new m_hMyWeapons = FindSendPropOffs("CBasePlayer", "m_hMyWeapons");
  new Offset = FindDataMapOffs(client, "m_iAmmo");
  new index = CreateEntityByName("game_player_equip");

  if (index < 1) return;

  DispatchKeyValue(index,    classname, "1");
  DispatchSpawn(index);
  ActivateEntity(index);
  AcceptEntityInput(index, "use", client);
  AcceptEntityInput(index, "kill");
  for(new i = 0, weapon; i < 128; i += 4)
  {
   weapon = GetEntDataEnt2(client, m_hMyWeapons + i);

   if(IsValidEdict(weapon) && IsValidEntity(weapon))
   {
    decl String:ClassWeapon[32]; ClassWeapon[0] = '\0';
    GetEdictClassname(weapon, ClassWeapon, sizeof(ClassWeapon));
    if (weapon > 0 && strcmp(ClassWeapon, classname, false) == 0)
    {
     new m_iClip1 = GetEntProp(weapon, Prop_Data, "m_iClip1");
     new ammotype = GetEntProp(weapon, Prop_Data, "m_iPrimaryAmmoType");
     new ammotype2 = GetEntProp(weapon, Prop_Data, "m_iSecondaryAmmoType");
     new m_iPrimaryAmmoType = GetEntData(client, Offset + ammotype * 4, 4);
     new m_iSecondaryAmmoType = GetEntData(client, Offset + ammotype2 * 4, 4);
     if (m_iClip1 >= 0)
      SetEntProp(weapon, Prop_Data, "m_iClip1", q);
     if (m_iPrimaryAmmoType >= 0)
      SetEntData(client, Offset + ammotype * 4, w, 4, true);
     if (m_iSecondaryAmmoType >= 0)
      SetEntData(client, Offset + ammotype2 * 4, e, 4, true);
    }
   }
  }
}


Удачи! verh

Гости не могут скачивать файлы
 
In-com_Software Дата: Суббота, 14.12.2013, 09:34:22 | Сообщение # 3
Сообщений: 17
Репутация: 0 [ +/- ]
Цитата Sunday ()
можно конечно сделать так. Вариант 1:

То что нужно, использовал вариант 1 klas
Премного благодарен Вам Sunday и проекту world-source.ru, в какой раз уже меня выручаете vshapke
 
  • Страница 1 из 1
  • 1
Поиск: