
Ostatnio był temat w którym się spierałem czym zabijać gracza dlatego zrobiłem ciekawą funkcję

KillPlayer:
KillPlayer(id,inflictor,attacker,weapon,body,shouldgib,damagebits) { if(weapon > 30 || !is_user_alive(id) || !is_user_connected(attacker)) return const GrenadeWeapon = 1<<CSW_HEGRENADE | 1<<CSW_C4 | 1<<CSW_SMOKEGRENADE | 1<<CSW_FLASHBANG const m_LastHitGroup = 75 const m_bitsDamageType = 76 const m_fHasTakenHighDamage = 107 static DeathMsgId new msgblock,weaponname[32],effect if (!DeathMsgId) DeathMsgId = get_user_msgid("DeathMsg") set_pdata_int(id,m_LastHitGroup,body,5) set_pdata_int(id,m_bitsDamageType,damagebits,5) set_pdata_int(id,m_fHasTakenHighDamage,1,5) set_pev(id,pev_dmg_inflictor,inflictor) msgblock = get_msg_block(DeathMsgId) set_msg_block(DeathMsgId, BLOCK_SET) ExecuteHamB(Ham_Killed,id,attacker,shouldgib) set_msg_block(DeathMsgId, msgblock) if(is_user_alive(id)) return effect = pev(id,pev_effects) if(effect & 128) set_pev(id,pev_effects,effect-128) new len if(get_weaponname(weapon,weaponname,31)) { if(~GrenadeWeapon & 1<<weapon) len = 7 else weaponname = "grenade" } else if(weapon == 2) weaponname = "tracktrain" else weaponname = "world" emessage_begin(MSG_ALL, DeathMsgId) ewrite_byte(attacker) ewrite_byte(id) ewrite_byte(body == HIT_HEAD ? 1:0) ewrite_string(weaponname[len]) emessage_end() }Działanie: Zabija gracza
Zalety: Poprawnie dodaje nam fraga do ranku, do tablicy wyników, poprawnie wyskakuje ikonka zabicia w prawym górnym rogu. Nie zadaje dmg a poprostu zabija a zatem żaden inny plugin modyfikujący dmg nie przerwie procesu zabijania gracza. Taki kill na 100% (99,(9)%) Dodatkowo: usuwa zbędne efekty,ustawia byt jakim zabijamy (inflictor), część ciała w którą trafiliśmy śmiertelnym ciosem, ustawia takie jakie chcemy damagebits

Wady: Brak
Parametry:
• id - osoba którą chcemy zabić (1~32)
• inflictor - byt którym zabijamy (przy broniach z cs'a inflictor == attacker jedynie przy he to byt)
• attacker - osoba która ma zabić osobe id (1~32)
• weapon - numer broni (to z CSW_*) którą mamy zabić gracza. W przypadku weapon == 0 broń zabijająca to "world" czyli pokaże nam czache w prawym górnym rogu
• body - część ciała w którą trafiliśmy (części ciała te z HIT_*) w przypadku wybuchów (np. he) body == 0
• shouldgib - sposób w jaki ma zostać pokazane ciało po śmierci (typy GIB_*)
• damagebits - damagebits które spowodowało śmierć (DMG_*)
Przykładowe użycie:
KillPlayer(1,124,2,CSW_HEGRENADE,HIT_GENERIC,0,1<24)Gracz o id 2 zabija gracza o id 1 za pomocą granatu HE o id 124.W taki sam sposób cs zabija graczy z HE

Teraz funkcje operujące na broniach:
SetUserWeaponInHand:
SetUserWeaponInHand(id,weapon) { const m_pActiveItem = 373 const m_pPlayer = 41 new classname[32] if(is_user_alive(id) && get_weaponname(weapon,classname,31) && weapon !=2 && weapon <= 30) { while((weapon = engfunc(EngFunc_FindEntityByString,weapon,"classname",classname))) { if(pev_valid(weapon) == 2 && get_pdata_cbase(weapon,m_pPlayer,4) == id) { set_pdata_cbase(id,m_pActiveItem,weapon,5) ExecuteHam(Ham_Item_Deploy, weapon) return weapon } } } return 0 }Działanie: Ustawia graczu broń w dłoni. Zwróci 0 jeśli gracz nie posiada danej broni. Dodatkowo zwraca id bytu nowo trzymanej broni
Zalety: Nie wysyła graczu komendy do konsoli aby zmienić broń a po prostu informuje gracza która broń teraz trzyma. Szybsze działanie funkcji niż client_cmd



Wady: Brak
Parametry:
• id - osoba której zmieniamy broń (1~32)
• weapon - numer broni (to z CSW_*) na która chcemy zmienić
Przykładowe użycie:
SetUserWeaponInHand(id,CSW_KNIFE)Gracz o id równym id wyciągnie nóż.
GetUserWeapon:
GetUserWeapon(id,&wid=0) { const m_pActiveItem = 373 const m_iId = 43 if(!is_user_alive(id) || pev_valid((wid = get_pdata_cbase(id,m_pActiveItem,5))) != 2) return 0 return get_pdata_int(wid,m_iId,4) }Działanie: Zwraca id broni którą aktualnie mamy wyciągniętą (id z CSW_* poprzez return i id bytu broni poprzez referencję w opcjonalnym drugim parametrze)
Zalety: Funkcja zwróci poprawne id (CSW_*/bytu) nawet podczas wyciągania broni lub jej chowania. Po co to komu? Przeciez jest get_user_weapon


Wady: Brak
Parametry:
• id - osoba której sprawdzamy broń (1~32)
• wid* - do tego argumentu zostanie wpakowane id bytu aktualnie posiadanej broni poprzez referencję
* - argument opcjonalny tzn. argument niewymagany można go pominąc jeśli się go nie chce
Przykładowe użycie:
new weapon = GetUserWeapon(id)Do zmiennej weapon zostanie wpakowane id (to z CSW_*) broni którą aktualnie trzymamy
Lub:
new wid new weapon = GetUserWeapon(id,wid)Do zmiennej weapon zostanie wpakowane id (to z CSW_*) broni którą aktualnie trzymamy oraz do zmiennej wid zostanie wpakowane id bytu naszej broni
GetUserAmmo:
GetUserAmmo(id,&ammo=0,&bpammo=0,weapon=0) { const m_iPrimaryAmmoType = 49 const m_rgAmmo = 376 const m_iClip = 51 const m_pActiveItem = 373 const m_pPlayer = 41 if(!is_user_alive(id) || (!weapon && pev_valid((weapon = get_pdata_cbase(id,m_pActiveItem,5))) != 2)) return 0 new classname[32] if(weapon <= 30 && get_weaponname(weapon,classname,31)) { while((weapon = engfunc(EngFunc_FindEntityByString,weapon,"classname",classname))) { if(pev_valid(weapon) == 2 && get_pdata_cbase(weapon,m_pPlayer,4) == id) goto GetAmmo } return 0 } GetAmmo: ammo = get_pdata_int(weapon,m_iClip,4) bpammo = get_pdata_int(id,m_rgAmmo+get_pdata_int(weapon,m_iPrimaryAmmoType,4),5) return weapon }Działanie: Pobiera do drugiego argumentu (opcjonalnego) ilość ammo nabitego, do trzeciego argumentu (opcjonalnego) ilośc ammo w plecaku gracza, oraz zwraca id bytu broni (dla broni wyciągniętej w przypadku weapon == 0 lub dla danej broni weapon == CSW_*). Zwróci 0 w przypadku gdy broń zawarta w argumencie weapon nie zostanie odnaleziona
Zalety: Funkcja działa jak ty chcesz możesz pobrać tylko ammo w plecaku lub tylko ammo nabite, możesz pobrac ammo dla wyciągniętej broni lub dla jakiejś której aktualnie nie trzymamy ale ją posiadamy
Wady: Nie da się pobrać ammo w plecaku jeśli gracz nie posiada danej broni

Parametry:
• id - osoba której sprawdzamy ammo (1~32)
• ammo* - do tego argumentu zostanie wpakowana ilość ammo, która jest nabita w broni
• bpammo* - do tego argumentu zostanie wpakowana ilość ammo, która jest w plecaku dla danej broni
• weapon* - ten argument decyduje czy ma pobrać ammo dla broni aktualnie wyciągniętej (weapon == 0) czy dla broni posiadanej (weapon == CSW_*)
* - argument opcjonalny tzn. argument niewymagany można go pominąc jeśli się go nie chce
Przykładowe użycie:
new weapon,ammo,bpammo weapon = GetUserAmmo(id,ammo,bpammo)Do zmiennej weapon zostanie wpakowane id bytu broni którą aktualnie trzymamy, do zmiennej ammo zostanie wpakowana ilośc ammo nabitego w broni oraz do zmiennej bpammo zostanie wpakowana ilośc ammo posiadanego w plecaku przez gracza do tej broni
Lub:
new bpammo GetUserAmmo(id,.bpammo=bpammo,.weapon=CSW_AK47)O ile gracz posiada AK47 to do zmiennej bpammo zostanie zwrócona ilość ammo posiadanego w plecaku do AK47
SetUserAmmo:
SetUserAmmo(id,ammo=-2,bpammo=-2,weapon=0) { const m_iPrimaryAmmoType = 49 const m_rgAmmo = 376 const m_iClip = 51 const m_pActiveItem = 373 const m_pPlayer = 41 const m_fWeapon = 351 if(!is_user_alive(id) || (!weapon && pev_valid((weapon = get_pdata_cbase(id,m_pActiveItem,5))) != 2)) return 0 new classname[32] if(weapon <= 30 && get_weaponname(weapon,classname,31)) { while((weapon = engfunc(EngFunc_FindEntityByString,weapon,"classname",classname))) { if(pev_valid(weapon) == 2 && get_pdata_cbase(weapon,m_pPlayer,4) == id) goto SetAmmo } return 0 } SetAmmo: if(ammo > -2) set_pdata_int(weapon,m_iClip,ammo,4) if(bpammo > -2) set_pdata_int(id,m_rgAmmo+get_pdata_int(weapon,m_iPrimaryAmmoType,4),bpammo,5) set_pdata_int(id,m_fWeapon,0,5) return weapon }Działanie: Ustawia graczu ilość ammo nabitego i/lub w plecaku dla aktualnej broni lub wybranej. Można także ustawić by z którejś broni nie dało się strzelać (ammo == -1 i bpammo == -1) efekt bardzo ciekawy. Odświeża hud.
Zalety: Odświeża hud po zmianie ilości ammo. Możliwośc zablokowania strzelania z danej broni. Możliwość ustawienia tyle i takie ammo jakie chcemy.
Wady: Nie da się ustawić ammo w plecaku jeśli gracz nie posiada danej broni

Parametry:
• id - osoba której ustawiamy ammo (1~32)
• ammo* - ilośc ammo nabita jaka zostanie ustawiona
• bpammo* - ilośc ammo w plecaku jaka zostanie ustawiona
• weapon* - ten argument decyduje czy ma ustawić ammo dla broni aktualnie wyciągniętej (weapon == 0) czy dla broni posiadanej (weapon == CSW_*)
* - argument opcjonalny tzn. argument niewymagany można go pominąc jeśli się go nie chce
Przykładowe użycie:
SetUserAmmo(id,0,0)Zabranie wszystkiego ammo aktualnie trzymanej broni.
Lub:
SetUserAmmo(id,100,.weapon=CSW_USP)O ile gracz posiada USP to ilośc nabitego ammo w USP zostanie zmieniona na 100 (no to sobie można postrzelać

Lub:
SetUserAmmo(id,-1,-1,CSW_M4A1)Zablokowanie możliwości strzelanie (nie widać ilości ammo w hud, nie słychac pykania pustego magazynku). Efekt do przeładowania.
GetWeaponAmmo:
GetWeaponAmmo(wid) { const m_iClip = 51 if(pev_valid(wid) != 2) return 0 return get_pdata_int(wid,m_iClip,4) }Działanie: Zwraca ilośc ammo w danej broni
Zalety: Możliwośc sprawdzenia ilości ammo nawet jeśli broń leży na ziemi
Wady: Brak
Parametry:
• wid - id bytu broni (nie mylić z CSW_*)
Przykładowe użycie:
new ammo = GetWeaponAmmo(wid)Do zmiennej ammo zostanie wpakowana ilość ammo nabitego w broni o id równym wid
SetWeaponAmmo:
SetWeaponAmmo(wid,ammo) { const m_fWeapon = 351 const m_iClip = 51 const m_pActiveItem = 373 const m_pPlayer = 41 if(pev_valid(wid) != 2) return set_pdata_int(wid,m_iClip,ammo,4) new id = get_pdata_cbase(wid,m_pPlayer,4) if(is_user_alive(id) && get_pdata_cbase(id,m_pActiveItem,5) == wid) set_pdata_int(id,m_fWeapon,0,5) }Działanie: Ustawia ilość ammo nabitego w danej broni. Jeśli trzyma tą broń gracz to odświeża mu hud
Zalety: Możliwośc ustawienia ilości ammo nawet jeśli broń leży na ziemi
Wady: Brak
Parametry:
• wid - id bytu broni (nie mylić z CSW_*)
• ammo - ilośc ammo która zostanie ustawiona
Przykładowe użycie:
SetWeaponAmmo(wid,5)Broni o id równym wid zostanie ustawiona ilośc ammo równa 5
GetUserWeaponsId:
GetUserWeaponsId(id,wid,slot=0) { static const m_rgpPlayerItems[6] = { 367 , 368 , ... } const m_pPlayer = 41 const m_pNext = 42 if(pev_valid(wid) != 2) { if(slot) { wid = get_pdata_cbase(id,m_rgpPlayerItems[slot],5) return pev_valid(wid) == 2 ? wid:0 } } else if(get_pdata_cbase(wid,m_pPlayer,4) == id) { new numslot = ExecuteHam(Ham_Item_ItemSlot,wid)+1 wid = get_pdata_cbase(wid,m_pNext,4) if(pev_valid(wid) == 2) return wid else if(slot) return 0 slot = numslot } for(new i = slot;i<6;i++) { wid = get_pdata_cbase(id,m_rgpPlayerItems[i],5) if(pev_valid(wid) == 2) return wid } return 0 }Działanie: Zwraca id bytu następnej posiadanej broni (lub pierwszej w przypadku wid == 0). W danym slocie lub we wszystkich slotach. Działa na podobnej zasadzie do find_ent_by_owner


Zalety: W łatwy sposób można przelecieć po wszystkich broniach gracza lub z danego slota
Wady: Brak
Parametry:
• id - id gracza z którego zostanie pobrana broń (1~32)
• wid - id poprzedniej broni (nie mylić z CSW_*)
• slot* - ten argument decyduje czy pobierać bronie ze wszystkich slotów (slot == 0) czy z danego (slot == x)
* - argument opcjonalny tzn. argument niewymagany można go pominąc jeśli się go nie chce
Przykładowe użycie:
new wid while((wid = GetUserWeaponsId(id,wid))) { SetWeaponAmmo(wid,0) }Wszystkim broniom gracza zostanie zabrane nabite ammo tzn. nabite ammo we wszystkich broniach == 0

Lub:
new wid while((wid = GetUserWeaponsId(id,wid,1))) { SetWeaponAmmo(wid,GetWeaponAmmo(wid)+10) }Do każdej broni gracza w slocie nr. 1 (primary weapon) zostanie dodane 10 ammo
GetUserWeaponId:
GetUserWeaponId(id,weapon) { static const m_rgpPlayerItems[6] = { 367 , 368 , ... } const m_pNext = 42 const m_pNext = 42 const m_iId = 43 static const iWeaponsSlots[] = { -1, 2, -1, 1, 4, 1, 5, 1, 1, 4, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 3, 1 } if(weapon == 2 || !(0 < weapon < 31)) return 0 new wid = get_pdata_cbase(id,m_rgpPlayerItems[iWeaponsSlots[weapon]],5) while(pev_valid(wid) == 2) { if(get_pdata_int(wid,m_iId,4) == weapon) return wid wid = get_pdata_cbase(wid,m_pNext,4) } return 0 }Działanie: Zwraca id bytu wybranej broni o ile ją posiadamy.
Zalety: Zwróci id nawet jeśli danej broni nie trzymamy w rękach a mamy ją w plecaku
Wady: Brak
Parametry:
• id - id gracza z którego zostanie pobrana broń (1~32)
• weapon - numer broni (to z CSW_*)
Przykładowe użycie:
new wid = GetUserWeaponId(id,CSW_AK47)Do zmiennej wid zostanie wpakowane id bytu nszego AK47 (o ile go posiadamy)
GetWeaponId:
GetWeaponId(wid) { const m_iId = 43 if(pev_valid(wid) != 2) return 0 return get_pdata_int(wid,m_iId,4) }Działanie: Zwraca numer broni (to z CSW_*) na podstawie id bytu broni
Zalety: Brak
Wady: Brak
Parametry:
• wid - id bytu broni
Przykładowe użycie:
new weapon = GetWeaponId(wid)Do zmiennej weapon wpakowaliśmy numer (ten z CSW_*) broni o id równym wid
To tyle nie chcemi się już więcej tego pisać. Powiem jeszcze że sume bitowa wszystkich broni gracza można pobrać za pomocą pev_weapons. Czemu czasem używam szukania za pomocą FindEntByString a czasem przeszukuje bronie gracza? By pokazać wam dwa sposoby 1 jest szybszy o ile nie ma na mapie powyżej 30 entów o tym samym classname. Mam nadzieję że nigdzie offsetu nie pomyliłem. Szczególnie polecam zabijania gracza za pomocą KillPlayer ;D