Sunday
|
Дата: Суббота, 14.12.2013, 04:14:46 | Сообщение # 2 |
![Пользователь](http://world-source.ru/groupicon/user_icon.jpg) |
Сообщений: 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](http://world-source.ru/smiles/verh.gif)
Гости не могут скачивать файлы
|
|
|
| |