- //// ze_items_escape_coins.sma
- //
- // C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_items_escape_coins.sma(21 -- 22) : warning 213: tag mismatch
- // C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_items_escape_coins.sma(43 -- 44) : warning 213: tag mismatch
- // Header size: 780 bytes
- // Code size: 1696 bytes
- // Data size: 764 bytes
- // Stack/heap size: 16384 bytes
- // Total requirements: 19624 bytes
- //
- // 2 Warnings.
- // Done.
Vip extra Item Discounts
Vip extra Item Discounts
Raheem,
As we talked about in chat lets see if we can do this with the vip system.
If player is vip he will get a discount on buying extra items.
This is for reference as the plugin that somewhat does this.
https://forums.alliedmods.net/showthrea ... ost2155009
As we talked about in chat lets see if we can do this with the vip system.
If player is vip he will get a discount on buying extra items.
This is for reference as the plugin that somewhat does this.
https://forums.alliedmods.net/showthrea ... ost2155009
The deduction of coins done in ze_items_escape_coins.sma so we will check in it:
By this it will add 50% discount for all VIPS, so they will buy it with half price. Next thing we will need is to add extra-text maybe for VIPS? that say 50% discount?
- #include <zombie_escape>
- #include <ze_vip>
- new g_iCurrentEC,
- g_iRequiredEC
- public plugin_init()
- {
- register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS)
- }
- public ze_select_item_pre(id, itemid, ignorecost)
- {
- if (ignorecost)
- return ZE_ITEM_AVAILABLE
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * 0.5) // 50 % discount
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- if (g_iCurrentEC < g_iRequiredEC)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid, ignorecost)
- {
- if (ignorecost)
- return
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * 0.5) // 50 % discount
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC)
- }
By this it will add 50% discount for all VIPS, so they will buy it with half price. Next thing we will need is to add extra-text maybe for VIPS? that say 50% discount?
Last edited by Raheem 5 years ago, edited 1 time in total.
Reason: Convert to integer --> floatround()
Reason: Convert to integer --> floatround()
He who fails to plan is planning to fail
Yea thats a good idea!Raheem wrote: ↑5 years ago The deduction of coins done in ze_items_escape_coins.sma so we will check in it:
#include <zombie_escape> #include <ze_vip> new g_iCurrentEC, g_iRequiredEC public plugin_init() { register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS) } public ze_select_item_pre(id, itemid, ignorecost) { if (ignorecost) return ZE_ITEM_AVAILABLE g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id)) { g_iRequiredEC = ze_get_item_cost(itemid) * 0.5 // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } if (g_iCurrentEC < g_iRequiredEC) return ZE_ITEM_UNAVAILABLE return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid, ignorecost) { if (ignorecost) return g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id)) { g_iRequiredEC = ze_get_item_cost(itemid) * 0.5 // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC) }
By this it will add 50% discount for all VIPS, so they will buy it with half price. Next thing we will need is to add extra-text maybe for VIPS? that say 50% discount?
Raheem wrote: ↑5 years ago The deduction of coins done in ze_items_escape_coins.sma so we will check in it:
#include <zombie_escape> #include <ze_vip> new g_iCurrentEC, g_iRequiredEC public plugin_init() { register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS) } public ze_select_item_pre(id, itemid, ignorecost) { if (ignorecost) return ZE_ITEM_AVAILABLE g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id)) { g_iRequiredEC = ze_get_item_cost(itemid) * 0.5 // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } if (g_iCurrentEC < g_iRequiredEC) return ZE_ITEM_UNAVAILABLE return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid, ignorecost) { if (ignorecost) return g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id)) { g_iRequiredEC = ze_get_item_cost(itemid) * 0.5 // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC) }
By this it will add 50% discount for all VIPS, so they will buy it with half price. Next thing we will need is to add extra-text maybe for VIPS? that say 50% discount?
FIXED, updated the code. Try now.
He who fails to plan is planning to fail
For test
- #include <zombie_escape>
- #include <engine>
- #include <fakemeta_util>
- #include <cstrike>
- #include <fun>
- #include <xs>
- #define PLUGIN "[CSO] Dual Uzi"
- #define VERSION "1.0"
- #define AUTHOR "Dias Pendragon"
- // Data Config
- #define MODEL_V "models/v_dualuzi.mdl"
- #define MODEL_P "models/p_dualuzi.mdl"
- #define MODEL_W "models/w_dualuzi.mdl"
- #define MODEL_W_OLD "models/w_mp5.mdl"
- #define CSW_BASE CSW_MP5NAVY
- #define weapon_base "weapon_mp5navy"
- #define SUBMODEL -1 // can -1
- #define WEAPON_CODE 2102015
- #define WEAPON_EVENT "events/mp5n.sc"
- #define ANIM_EXT "dualpistols"
- #define ANIME_SHOOT 3
- #define ANIME_RELOAD 15 // can -1
- #define ANIME_DRAW 16 // can -1
- #define ANIME_IDLE random_num(0, 1) // can -1
- const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_AK47)|(1<<CSW_M4A1)|(1<<CSW_FAMAS)|(1<<CSW_GALIL)|(1<<CSW_SCOUT)|(1<<CSW_AWP)|(1<<CSW_M249)|(1<<CSW_MP5NAVY)|(1<<CSW_P90)|(1<<CSW_MAC10)|(1<<CSW_TMP)|(1<<CSW_XM1014)|(1<<CSW_M3)|(1<<CSW_G3SG1)|(1<<CSW_SG550)|(1<<CSW_SG552)|(1<<CSW_AUG)|(1<<CSW_UMP45);
- new const WeaponSounds[10][] =
- {
- "weapons/dualuzi-1.wav",
- "weapons/dualuzi_draw.wav",
- "weapons/dualuzi_idle2_1.wav",
- "weapons/dualuzi_idle2_2.wav",
- "weapons/dualuzi_clipin1.wav",
- "weapons/dualuzi_clipout1.wav",
- "weapons/dualuzi_off_shoulder.wav",
- "weapons/dualuzi_on_shoulder.wav",
- "weapons/dualuzi_on_shoulder_reload1.wav",
- "weapons/dualuzi_on_shoulder_reload2.wav"
- }
- enum
- {
- ANIME_IDLEX = 0,
- ANIME_IDLE2,
- ANIME_LEFT_EMPTY,
- ANIME_SHOOT_L1,
- ANIME_SHOOT_L2,
- ANIME_SHOOT_L3,
- ANIME_SHOOT_L4,
- ANIME_SHOOT_L5,
- ANIME_SHOOT_LLAST,
- ANIME_SHOOT_R1,
- ANIME_SHOOT_R2,
- ANIME_SHOOT_R3,
- ANIME_SHOOT_R4,
- ANIME_SHOOT_R5,
- ANIME_SHOOT_RLAST,
- ANIME_RELOADX,
- ANIME_DRAWX,
- ANIME_CHANGE_TO_B,
- ANIME_B_IDLE,
- ANIME_B_SHOOT_L,
- ANIME_B_SHOOT_LLAST,
- ANIME_B_LEFT_EMPTY,
- ANIME_B_SHOOT_R,
- ANIME_B_SHOOT_RLAST,
- ANIME_B_RELOAD,
- ANIME_CHANGE_TO_A
- }
- // Weapon Config
- #define DAMAGE 26 // 52 for Zombie
- #define ACCURACY 70 // 0 - 100 ; -1 Default
- #define CLIP 80
- #define BPAMMO 240
- #define SPEED 0.05
- #define RECOIL 0.5
- #define RELOAD_TIME 3.0
- // MACROS
- #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
- #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
- #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
- //new g_Base
- new g_Had_Base, g_Clip[33], g_OldWeapon[33], Float:g_Recoil[33][3]
- new g_Event_Base, g_SmokePuff_SprId, g_MsgCurWeapon, g_ShellId, g_iItemID
- // Safety
- new g_HamBot
- new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- // Safety
- Register_SafetyFunc()
- // Event
- register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
- // Forward
- register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
- register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
- register_forward(FM_SetModel, "fw_SetModel")
- register_forward(FM_CmdStart, "fw_CmdStart")
- // Ham
- RegisterHam(Ham_Item_Deploy, weapon_base, "fw_Item_Deploy_Post", 1)
- RegisterHam(Ham_Item_AddToPlayer, weapon_base, "fw_Item_AddToPlayer_Post", 1)
- RegisterHam(Ham_Weapon_WeaponIdle, weapon_base, "fw_Weapon_WeaponIdle_Post", 1)
- RegisterHam(Ham_Item_PostFrame, weapon_base, "fw_Item_PostFrame")
- RegisterHam(Ham_Weapon_Reload, weapon_base, "fw_Weapon_Reload")
- RegisterHam(Ham_Weapon_Reload, weapon_base, "fw_Weapon_Reload_Post", 1)
- RegisterHam(Ham_Weapon_PrimaryAttack, weapon_base, "fw_Weapon_PrimaryAttack")
- RegisterHam(Ham_Weapon_PrimaryAttack, weapon_base, "fw_Weapon_PrimaryAttack_Post", 1)
- RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
- RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
- // Cache
- g_MsgCurWeapon = get_user_msgid("CurWeapon")
- // Get
- g_iItemID = ze_register_item("Dual Uzi", 0, 0)
- }
- public plugin_precache()
- {
- precache_model(MODEL_V)
- precache_model(MODEL_P)
- precache_model(MODEL_W)
- for(new i = 0; i < sizeof(WeaponSounds); i++)
- precache_sound(WeaponSounds[i])
- g_ShellId = engfunc(EngFunc_PrecacheModel, "models/pshell.mdl")
- g_SmokePuff_SprId = engfunc(EngFunc_PrecacheModel, "sprites/wall_puff1.spr")
- register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
- }
- public fw_PrecacheEvent_Post(type, const name[])
- {
- if(equal(WEAPON_EVENT, name)) g_Event_Base = get_orig_retval()
- }
- public client_putinserver(id)
- {
- Safety_Connected(id)
- if(!g_HamBot && is_user_bot(id))
- {
- g_HamBot = 1
- set_task(0.1, "Register_HamBot", id)
- }
- }
- public Register_HamBot(id)
- {
- Register_SafetyFuncBot(id)
- RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")
- }
- public client_disconnected(id)
- {
- Safety_Disconnected(id)
- }
- /*
- public Mileage_WeaponGet(id, ItemID)
- {
- if(ItemID == g_Base) Get_Base(id)
- }
- public Mileage_WeaponRefillAmmo(id, ItemID)
- {
- if(ItemID == g_Base) cs_set_user_bpammo(id, CSW_BASE, BPAMMO)
- }
- public Mileage_WeaponRemove(id, ItemID)
- {
- if(ItemID == g_Base) Remove_Base(id)
- }*/
- public ze_select_item_pre(id, itemid)
- {
- if (itemid != g_iItemID)
- return ZE_ITEM_AVAILABLE
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- if (itemid != g_iItemID)
- return
- Get_Base(id)
- }
- public ze_user_humanized(id)
- {
- Remove_Base(id)
- }
- public Get_Base(id)
- {
- drop_weapons(id, 1);
- Set_BitVar(g_Had_Base, id)
- give_item(id, weapon_base)
- // Clip & Ammo
- static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(!pev_valid(Ent)) return
- cs_set_weapon_ammo(Ent, CLIP)
- cs_set_user_bpammo(id, CSW_BASE, BPAMMO)
- message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
- write_byte(1)
- write_byte(CSW_BASE)
- write_byte(CLIP)
- message_end()
- cs_set_weapon_silen(Ent, 0, 0)
- }
- public Remove_Base(id)
- {
- UnSet_BitVar(g_Had_Base, id)
- }
- public Event_CurWeapon(id)
- {
- static CSWID; CSWID = read_data(2)
- static SubModel; SubModel = SUBMODEL
- if((CSWID == CSW_BASE && g_OldWeapon[id] != CSW_BASE) && Get_BitVar(g_Had_Base, id))
- {
- if(SubModel != -1) Draw_NewWeapon(id, CSWID)
- } else if((CSWID == CSW_BASE && g_OldWeapon[id] == CSW_BASE) && Get_BitVar(g_Had_Base, id)) {
- static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(!pev_valid(Ent))
- {
- g_OldWeapon[id] = get_user_weapon(id)
- return
- }
- set_pdata_float(Ent, 46, SPEED, 4)
- set_pdata_float(Ent, 47, SPEED, 4)
- } else if(CSWID != CSW_BASE && g_OldWeapon[id] == CSW_BASE) {
- if(SubModel != -1) Draw_NewWeapon(id, CSWID)
- }
- g_OldWeapon[id] = get_user_weapon(id)
- }
- public Draw_NewWeapon(id, CSW_ID)
- {
- if(CSW_ID == CSW_BASE)
- {
- static ent
- ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(pev_valid(ent) && Get_BitVar(g_Had_Base, id))
- {
- set_pev(ent, pev_effects, pev(ent, pev_effects) &~ EF_NODRAW)
- engfunc(EngFunc_SetModel, ent, MODEL_P)
- set_pev(ent, pev_body, SUBMODEL)
- }
- } else {
- static ent
- ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(pev_valid(ent)) set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW)
- }
- }
- public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
- {
- if(!is_alive(id))
- return FMRES_IGNORED
- if(get_user_weapon(id) == CSW_BASE && Get_BitVar(g_Had_Base, id))
- set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
- return FMRES_HANDLED
- }
- public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
- {
- if (!is_connected(invoker))
- return FMRES_IGNORED
- if(get_player_weapon(invoker) != CSW_BASE || !Get_BitVar(g_Had_Base, invoker))
- return FMRES_IGNORED
- if(eventid != g_Event_Base)
- return FMRES_IGNORED
- engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
- DualAttack(invoker)
- return FMRES_SUPERCEDE
- }
- public DualAttack(id)
- {
- static iFlags, iAnimDesired, iWeaponState, iItem, szAnimation[64]
- #define WEAPONSTATE_ELITE_LEFT (1 << 3)
- iItem = fm_get_user_weapon_entity(id, CSW_BASE)
- if(!pev_valid(iItem)) return
- iFlags = pev(id, pev_flags);
- iWeaponState = get_pdata_int(iItem, 74, 4)
- if(iWeaponState & WEAPONSTATE_ELITE_LEFT)
- {
- iWeaponState &= ~ WEAPONSTATE_ELITE_LEFT;
- Set_WeaponAnim(id, ANIME_SHOOT_L1)
- Make_Shell(id, 1)
- formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot_%s" : "ref_shoot_%s", ANIM_EXT);
- } else {
- iWeaponState |= WEAPONSTATE_ELITE_LEFT;
- Set_WeaponAnim(id, ANIME_SHOOT_R1)
- Make_Shell(id, 0)
- formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot2_%s" : "ref_shoot2_%s", ANIM_EXT);
- }
- if((iAnimDesired = lookup_sequence(id, szAnimation)) == -1)
- iAnimDesired = 0;
- set_pev(id, pev_sequence, iAnimDesired)
- set_pdata_int(iItem, 74, iWeaponState, 4)
- emit_sound(id, CHAN_WEAPON, WeaponSounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15))
- }
- public Make_Shell(id, Right)
- {
- static Float:player_origin[3], Float:origin[3], Float:origin2[3], Float:gunorigin[3], Float:oldangles[3], Float:v_forward[3], Float:v_forward2[3], Float:v_up[3], Float:v_up2[3], Float:v_right[3], Float:v_right2[3], Float:viewoffsets[3];
- pev(id, pev_v_angle, oldangles); pev(id,pev_origin,player_origin); pev(id, pev_view_ofs, viewoffsets);
- engfunc(EngFunc_MakeVectors, oldangles)
- global_get(glb_v_forward, v_forward); global_get(glb_v_up, v_up); global_get(glb_v_right, v_right);
- global_get(glb_v_forward, v_forward2); global_get(glb_v_up, v_up2); global_get(glb_v_right, v_right2);
- xs_vec_add(player_origin, viewoffsets, gunorigin);
- if(!Right)
- {
- xs_vec_mul_scalar(v_forward, 10.3, v_forward); xs_vec_mul_scalar(v_right, 2.0, v_right);
- xs_vec_mul_scalar(v_up, -2.7, v_up);
- xs_vec_mul_scalar(v_forward2, 10.0, v_forward2); xs_vec_mul_scalar(v_right2, 4.0, v_right2);
- xs_vec_mul_scalar(v_up2, -3.0, v_up2);
- } else {
- xs_vec_mul_scalar(v_forward, 10.3, v_forward); xs_vec_mul_scalar(v_right, -4.0, v_right);
- xs_vec_mul_scalar(v_up, -3.7, v_up);
- xs_vec_mul_scalar(v_forward2, 10.0, v_forward2); xs_vec_mul_scalar(v_right2, 2.0, v_right2);
- xs_vec_mul_scalar(v_up2, -4.0, v_up2);
- }
- xs_vec_add(gunorigin, v_forward, origin);
- xs_vec_add(gunorigin, v_forward2, origin2);
- xs_vec_add(origin, v_right, origin);
- xs_vec_add(origin2, v_right2, origin2);
- xs_vec_add(origin, v_up, origin);
- xs_vec_add(origin2, v_up2, origin2);
- static Float:velocity[3]
- get_speed_vector(origin2, origin, random_float(140.0, 160.0), velocity)
- static angle; angle = random_num(0, 360)
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_MODEL)
- engfunc(EngFunc_WriteCoord, origin[0])
- engfunc(EngFunc_WriteCoord,origin[1])
- engfunc(EngFunc_WriteCoord,origin[2])
- engfunc(EngFunc_WriteCoord,velocity[0])
- engfunc(EngFunc_WriteCoord,velocity[1])
- engfunc(EngFunc_WriteCoord,velocity[2])
- write_angle(angle)
- write_short(g_ShellId)
- write_byte(1)
- write_byte(20)
- message_end()
- }
- public fw_SetModel(entity, model[])
- {
- if(!pev_valid(entity))
- return FMRES_IGNORED
- static Classname[32]
- pev(entity, pev_classname, Classname, sizeof(Classname))
- if(!equal(Classname, "weaponbox"))
- return FMRES_IGNORED
- static iOwner
- iOwner = pev(entity, pev_owner)
- if(equal(model, MODEL_W_OLD))
- {
- static weapon; weapon = find_ent_by_owner(-1, weapon_base, entity)
- if(!pev_valid(weapon))
- return FMRES_IGNORED;
- if(Get_BitVar(g_Had_Base, iOwner))
- {
- set_pev(weapon, pev_impulse, WEAPON_CODE)
- engfunc(EngFunc_SetModel, entity, MODEL_W)
- set_pev(entity, pev_body, SUBMODEL)
- Remove_Base(iOwner)
- return FMRES_SUPERCEDE
- }
- }
- return FMRES_IGNORED;
- }
- public fw_CmdStart(id, uc_handle, seed)
- {
- if (!is_alive(id))
- return FMRES_IGNORED
- if(get_player_weapon(id) != CSW_BASE || !Get_BitVar(g_Had_Base, id))
- return FMRES_IGNORED
- static Button; Button = get_uc(uc_handle, UC_Buttons)
- if(Button & IN_ATTACK2)
- {
- static Float:Time; Time = get_pdata_float(id, 83, 5)
- if(Time > 0.0) return FMRES_IGNORED
- if(cs_get_user_zoom(id) != CS_SET_AUGSG552_ZOOM) cs_set_user_zoom(id, CS_SET_AUGSG552_ZOOM, 1)
- else cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
- Time = 0.25
- set_pdata_float(id, 83, Time, 5)
- }
- return FMRES_IGNORED
- }
- public fw_Item_Deploy_Post(Ent)
- {
- if(pev_valid(Ent) != 2)
- return
- static Id; Id = get_pdata_cbase(Ent, 41, 4)
- if(get_pdata_cbase(Id, 373) != Ent)
- return
- if(!Get_BitVar(g_Had_Base, Id))
- return
- static SubModel; SubModel = SUBMODEL
- set_pev(Id, pev_viewmodel2, MODEL_V)
- set_pev(Id, pev_weaponmodel2, SubModel != -1 ? "" : MODEL_P)
- static Draw; Draw = ANIME_DRAW
- if(Draw != -1) Set_WeaponAnim(Id, ANIME_DRAW)
- set_pdata_string(Id, (492) * 4, ANIM_EXT, -1 , 20)
- }
- public fw_Item_AddToPlayer_Post(Ent, id)
- {
- if(!pev_valid(Ent))
- return HAM_IGNORED
- if(pev(Ent, pev_impulse) == WEAPON_CODE)
- {
- Set_BitVar(g_Had_Base, id)
- set_pev(Ent, pev_impulse, 0)
- }
- return HAM_HANDLED
- }
- public fw_Item_PostFrame(ent)
- {
- static id; id = pev(ent, pev_owner)
- if(!is_user_alive(id))
- return HAM_IGNORED
- if(!Get_BitVar(g_Had_Base, id))
- return HAM_IGNORED
- static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
- static bpammo; bpammo = cs_get_user_bpammo(id, CSW_BASE)
- static iClip; iClip = get_pdata_int(ent, 51, 4)
- static fInReload; fInReload = get_pdata_int(ent, 54, 4)
- if(fInReload && flNextAttack <= 0.0)
- {
- static temp1
- temp1 = min(CLIP - iClip, bpammo)
- set_pdata_int(ent, 51, iClip + temp1, 4)
- cs_set_user_bpammo(id, CSW_BASE, bpammo - temp1)
- set_pdata_int(ent, 54, 0, 4)
- fInReload = 0
- }
- return HAM_IGNORED
- }
- public fw_Weapon_Reload(ent)
- {
- static id; id = pev(ent, pev_owner)
- if(!is_user_alive(id))
- return HAM_IGNORED
- if(!Get_BitVar(g_Had_Base, id))
- return HAM_IGNORED
- g_Clip[id] = -1
- static BPAmmo; BPAmmo = cs_get_user_bpammo(id, CSW_BASE)
- static iClip; iClip = get_pdata_int(ent, 51, 4)
- if(BPAmmo <= 0)
- return HAM_SUPERCEDE
- if(iClip >= CLIP)
- return HAM_SUPERCEDE
- g_Clip[id] = iClip
- return HAM_HANDLED
- }
- public fw_Weapon_Reload_Post(ent)
- {
- static id; id = pev(ent, pev_owner)
- if(!is_user_alive(id))
- return HAM_IGNORED
- if(!Get_BitVar(g_Had_Base, id))
- return HAM_IGNORED
- if((get_pdata_int(ent, 54, 4) == 1))
- { // Reload
- if(g_Clip[id] == -1)
- return HAM_IGNORED
- set_pdata_int(ent, 51, g_Clip[id], 4)
- static Reload; Reload = ANIME_RELOAD
- if(Reload != -1) Set_WeaponAnim(id, ANIME_RELOAD)
- Set_PlayerNextAttack(id, RELOAD_TIME)
- }
- return HAM_HANDLED
- }
- public fw_Weapon_WeaponIdle_Post( iEnt )
- {
- if(pev_valid(iEnt) != 2)
- return
- static Id; Id = get_pdata_cbase(iEnt, 41, 4)
- if(get_pdata_cbase(Id, 373) != iEnt)
- return
- if(!Get_BitVar(g_Had_Base, Id))
- return
- static Idle; Idle = ANIME_IDLE
- if(Idle != -1 && get_pdata_float(iEnt, 48, 4) <= 0.25)
- {
- Set_WeaponAnim(Id, ANIME_IDLE)
- set_pdata_float(iEnt, 48, 20.0, 4)
- }
- }
- public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
- {
- if(!is_connected(Attacker))
- return HAM_IGNORED
- if(get_player_weapon(Attacker) != CSW_BASE || !Get_BitVar(g_Had_Base, Attacker))
- return HAM_IGNORED
- static Float:flEnd[3], Float:vecPlane[3]
- get_tr2(Ptr, TR_vecEndPos, flEnd)
- get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)
- Make_BulletHole(Attacker, flEnd, Damage)
- Make_BulletSmoke(Attacker, Ptr)
- SetHamParamFloat(3, float(DAMAGE))
- return HAM_HANDLED
- }
- public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
- {
- if(!is_connected(Attacker))
- return HAM_IGNORED
- if(get_player_weapon(Attacker) != CSW_BASE || !Get_BitVar(g_Had_Base, Attacker))
- return HAM_IGNORED
- static Float:flEnd[3]
- get_tr2(Ptr, TR_vecEndPos, flEnd)
- SetHamParamFloat(3, float(DAMAGE))
- return HAM_HANDLED
- }
- public fw_Weapon_PrimaryAttack(Ent)
- {
- static id; id = pev(Ent, pev_owner)
- if(!is_alive(id))
- return
- if(!Get_BitVar(g_Had_Base, id))
- return
- pev(id, pev_punchangle, g_Recoil[id])
- }
- public fw_Weapon_PrimaryAttack_Post(Ent)
- {
- static id; id = pev(Ent, pev_owner)
- if(!is_alive(id))
- return
- if(!Get_BitVar(g_Had_Base, id))
- return
- static Float:Push[3]
- pev(id, pev_punchangle, Push)
- xs_vec_sub(Push, g_Recoil[id], Push)
- xs_vec_mul_scalar(Push, RECOIL, Push)
- xs_vec_add(Push, g_Recoil[id], Push)
- set_pev(id, pev_punchangle, Push)
- // Acc
- static Accena; Accena = ACCURACY
- if(Accena != -1)
- {
- static Float:Accuracy
- Accuracy = (float(100 - ACCURACY) * 1.5) / 100.0
- set_pdata_float(Ent, 62, Accuracy, 4);
- }
- }
- /* ===============================
- ------------- SAFETY -------------
- =================================*/
- public Register_SafetyFunc()
- {
- register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
- RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
- RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
- }
- public Register_SafetyFuncBot(id)
- {
- RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
- RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
- }
- public Safety_Connected(id)
- {
- Set_BitVar(g_IsConnected, id)
- UnSet_BitVar(g_IsAlive, id)
- g_PlayerWeapon[id] = 0
- }
- public Safety_Disconnected(id)
- {
- UnSet_BitVar(g_IsConnected, id)
- UnSet_BitVar(g_IsAlive, id)
- g_PlayerWeapon[id] = 0
- }
- public Safety_CurWeapon(id)
- {
- if(!is_alive(id))
- return
- static CSW; CSW = read_data(2)
- if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
- }
- public fw_Safety_Spawn_Post(id)
- {
- if(!is_user_alive(id))
- return
- Set_BitVar(g_IsAlive, id)
- }
- public fw_Safety_Killed_Post(id)
- {
- UnSet_BitVar(g_IsAlive, id)
- }
- public is_connected(id)
- {
- if(!(1 <= id <= 32))
- return 0
- if(!Get_BitVar(g_IsConnected, id))
- return 0
- return 1
- }
- public is_alive(id)
- {
- if(!is_connected(id))
- return 0
- if(!Get_BitVar(g_IsAlive, id))
- return 0
- return 1
- }
- public get_player_weapon(id)
- {
- if(!is_alive(id))
- return 0
- return g_PlayerWeapon[id]
- }
- /* ===============================
- --------- END OF SAFETY ---------
- =================================*/
- stock Set_WeaponAnim(id, anim)
- {
- set_pev(id, pev_weaponanim, anim)
- message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
- write_byte(anim)
- write_byte(pev(id, pev_body))
- message_end()
- }
- stock Make_BulletHole(id, Float:Origin[3], Float:Damage)
- {
- // Find target
- static Decal; Decal = random_num(41, 45)
- static LoopTime;
- if(Damage > 100.0) LoopTime = 2
- else LoopTime = 1
- for(new i = 0; i < LoopTime; i++)
- {
- // Put decal on "world" (a wall)
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_WORLDDECAL)
- engfunc(EngFunc_WriteCoord, Origin[0])
- engfunc(EngFunc_WriteCoord, Origin[1])
- engfunc(EngFunc_WriteCoord, Origin[2])
- write_byte(Decal)
- message_end()
- // Show sparcles
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_GUNSHOTDECAL)
- engfunc(EngFunc_WriteCoord, Origin[0])
- engfunc(EngFunc_WriteCoord, Origin[1])
- engfunc(EngFunc_WriteCoord, Origin[2])
- write_short(id)
- write_byte(Decal)
- message_end()
- }
- }
- stock Make_BulletSmoke(id, TrResult)
- {
- static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
- get_weapon_attachment(id, vecSrc)
- global_get(glb_v_forward, vecEnd)
- xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
- xs_vec_add(vecSrc, vecEnd, vecEnd)
- get_tr2(TrResult, TR_vecEndPos, vecSrc)
- get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
- xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
- xs_vec_add(vecSrc, vecEnd, vecEnd)
- TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
- TE_FLAG |= TE_EXPLFLAG_NOSOUND
- TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
- engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
- write_byte(TE_EXPLOSION)
- engfunc(EngFunc_WriteCoord, vecEnd[0])
- engfunc(EngFunc_WriteCoord, vecEnd[1])
- engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
- write_short(g_SmokePuff_SprId)
- write_byte(2)
- write_byte(50)
- write_byte(TE_FLAG)
- message_end()
- }
- stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
- {
- static Float:vfEnd[3], viEnd[3]
- get_user_origin(id, viEnd, 3)
- IVecFVec(viEnd, vfEnd)
- static Float:fOrigin[3], Float:fAngle[3]
- pev(id, pev_origin, fOrigin)
- pev(id, pev_view_ofs, fAngle)
- xs_vec_add(fOrigin, fAngle, fOrigin)
- static Float:fAttack[3]
- xs_vec_sub(vfEnd, fOrigin, fAttack)
- xs_vec_sub(vfEnd, fOrigin, fAttack)
- static Float:fRate
- fRate = fDis / vector_length(fAttack)
- xs_vec_mul_scalar(fAttack, fRate, fAttack)
- xs_vec_add(fOrigin, fAttack, output)
- }
- stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
- {
- new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
- pev(id, pev_origin, vOrigin)
- pev(id, pev_view_ofs,vUp) //for player
- xs_vec_add(vOrigin,vUp,vOrigin)
- pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
- angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
- angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
- angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
- vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
- vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
- vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
- }
- stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
- {
- new_velocity[0] = origin2[0] - origin1[0]
- new_velocity[1] = origin2[1] - origin1[1]
- new_velocity[2] = origin2[2] - origin1[2]
- new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
- new_velocity[0] *= num
- new_velocity[1] *= num
- new_velocity[2] *= num
- return 1;
- }
- stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
- {
- static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
- if(!pev_valid(entwpn))
- return
- set_pdata_float(entwpn, 46, TimeIdle, 4)
- set_pdata_float(entwpn, 47, TimeIdle, 4)
- set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
- }
- stock Set_PlayerNextAttack(id, Float:nexttime)
- {
- set_pdata_float(id, 83, nexttime, 5)
- }
- stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[])
- {
- static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
- pev(id, pev_origin, vOrigin)
- pev(id, pev_view_ofs,vUp) //for player
- xs_vec_add(vOrigin,vUp,vOrigin)
- pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
- angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
- angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
- angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
- vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
- vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
- vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
- }
- stock drop_weapons(id, dropwhat)
- {
- static weapons[32], num, i, weaponid
- num = 0
- get_user_weapons(id, weapons, num)
- for (i = 0; i < num; i++)
- {
- weaponid = weapons[i]
- if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
- {
- static wname[32]
- get_weaponname(weaponid, wname, sizeof wname - 1)
- engclient_cmd(id, "drop", wname)
- }
- }
- }
- /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
- *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1042\\ f0\\ fs16 \n\\ par }
- */
OK TRY:
1. ze_items_manager.sma
1. ze_items_manager.sma
- #include <zombie_escape>
- // Setting File
- new const ZE_EXTRAITEM_FILE[] = "ze_extraitems.ini"
- // Defines
- #define MENU_PAGE_ITEMS g_iMenuData[id]
- // Const
- const OFFSET_CSMENUCODE = 205
- // Forwards
- enum _:TOTAL_FORWARDS
- {
- FW_ITEM_SELECT_PRE = 0,
- FW_ITEM_SELECT_POST
- }
- new g_iForwards[TOTAL_FORWARDS],
- g_iForwardReturn
- // Variables
- new Array:g_szItemRealName,
- Array:g_szItemName,
- Array:g_iItemCost,
- Array:g_iItemLimit
- new g_iItemCount,
- g_szAdditionalMenuText[32],
- g_iMenuData[33],
- bool:g_bHasDiscount[MAX_EXTRA_ITEMS],
- Float:g_flDiscountValue[MAX_EXTRA_ITEMS]
- public plugin_init()
- {
- register_plugin("[ZE] Items Manager", ZE_VERSION, AUTHORS)
- // Commands
- register_clcmd("say /items", "Cmd_Items")
- // Forwards (In Pre Return Values important)
- g_iForwards[FW_ITEM_SELECT_PRE] = CreateMultiForward("ze_select_item_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL)
- g_iForwards[FW_ITEM_SELECT_POST] = CreateMultiForward("ze_select_item_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
- }
- public plugin_natives()
- {
- register_native("ze_register_item", "native_ze_register_item")
- register_native("ze_show_items_menu", "native_ze_show_items_menu")
- register_native("ze_force_buy_item", "native_ze_force_buy_item")
- register_native("ze_get_item_id", "native_ze_get_item_id")
- register_native("ze_get_item_cost", "native_ze_get_item_cost")
- register_native("ze_add_text_to_item", "native_ze_add_text_to_item")
- register_native("ze_get_item_limit", "native_ze_get_item_limit")
- register_native("ze_is_valid_itemid", "native_ze_is_valid_itemid")
- register_native("ze_get_item_name", "native_ze_get_item_name")
- register_native("ze_set_vip_discount", "native_ze_set_vip_discount", 1)
- register_native("ze_has_vip_discount", "native_ze_has_vip_discount", 1)
- register_native("ze_has_vip_discount", "native_ze_has_vip_discount", 1)
- register_native("ze_get_item_discount", "native_ze_get_item_discount", 1)
- g_szItemRealName = ArrayCreate(32, 1)
- g_szItemName = ArrayCreate(32, 1)
- g_iItemCost = ArrayCreate(1, 1)
- g_iItemLimit = ArrayCreate(1, 1)
- }
- public client_disconnected(id)
- {
- MENU_PAGE_ITEMS = 0
- }
- public Cmd_Items(id)
- {
- if (!is_user_alive(id))
- return
- Show_Items_Menu(id)
- }
- // Items Menu
- Show_Items_Menu(id)
- {
- static menu[128], name[32], cost, transkey[64]
- new menuid, index, itemdata[2]
- // Title
- formatex(menu, charsmax(menu), "%L:\r", id, "BUY_EXTRAITEM")
- menuid = menu_create(menu, "Extra_Items_Menu")
- // Item List
- for (index = 0; index < g_iItemCount; index++)
- {
- // Additional text to display
- g_szAdditionalMenuText[0] = 0
- // Execute item select attempt forward
- ExecuteForward(g_iForwards[FW_ITEM_SELECT_PRE], g_iForwardReturn, id, index, 0)
- // Show item to player?
- if (g_iForwardReturn >= ZE_ITEM_DONT_SHOW)
- continue;
- // Add Item Name and Cost
- ArrayGetString(g_szItemName, index, name, charsmax(name))
- cost = ArrayGetCell(g_iItemCost, index)
- // ML support for item name
- formatex(transkey, charsmax(transkey), "ITEMNAME %s", name)
- if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
- // Item available to player?
- if (g_iForwardReturn >= ZE_ITEM_UNAVAILABLE)
- formatex(menu, charsmax(menu), "\d%s %d %s", name, cost, g_szAdditionalMenuText)
- else
- formatex(menu, charsmax(menu), "%s \y%d \w%s", name, cost, g_szAdditionalMenuText)
- itemdata[0] = index
- itemdata[1] = 0
- menu_additem(menuid, menu, itemdata)
- }
- // No items to display?
- if (menu_items(menuid) <= 0)
- {
- ze_colored_print(id, "%L", id, "NO_EXTRA_ITEMS")
- menu_destroy(menuid)
- return;
- }
- // Back - Next - Exit
- formatex(menu, charsmax(menu), "%L", id, "BACK")
- menu_setprop(menuid, MPROP_BACKNAME, menu)
- formatex(menu, charsmax(menu), "%L", id, "NEXT")
- menu_setprop(menuid, MPROP_NEXTNAME, menu)
- formatex(menu, charsmax(menu), "%L", id, "EXIT")
- menu_setprop(menuid, MPROP_EXITNAME, menu)
- // If remembered page is greater than number of pages, clamp down the value
- MENU_PAGE_ITEMS = min(MENU_PAGE_ITEMS, menu_pages(menuid)-1)
- // Fix for AMXX custom menus
- set_pdata_int(id, OFFSET_CSMENUCODE, 0)
- menu_display(id, menuid, MENU_PAGE_ITEMS)
- }
- // Items Menu
- public Extra_Items_Menu(id, menuid, item)
- {
- // Menu was closed
- if (item == MENU_EXIT)
- {
- MENU_PAGE_ITEMS = 0
- menu_destroy(menuid)
- return PLUGIN_HANDLED;
- }
- // Remember items menu page
- MENU_PAGE_ITEMS = item / 7
- // Dead players are not allowed to buy items
- if (!is_user_alive(id))
- {
- menu_destroy(menuid)
- return PLUGIN_HANDLED;
- }
- // Retrieve item id
- new itemdata[2], dummy, itemid
- menu_item_getinfo(menuid, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
- itemid = itemdata[0]
- // Attempt to buy the item
- Buy_Item(id, itemid)
- menu_destroy(menuid)
- return PLUGIN_HANDLED;
- }
- // Buy Item
- Buy_Item(id, itemid, ignorecost = 0)
- {
- // Execute item select attempt forward
- ExecuteForward(g_iForwards[FW_ITEM_SELECT_PRE], g_iForwardReturn, id, itemid, ignorecost)
- // Item available to player?
- if (g_iForwardReturn >= ZE_ITEM_UNAVAILABLE)
- return;
- // Execute item selected forward
- ExecuteForward(g_iForwards[FW_ITEM_SELECT_POST], g_iForwardReturn, id, itemid, ignorecost)
- }
- // Natives
- public native_ze_register_item(plugin_id, num_params)
- {
- new szItem_Name[32], iItem_Cost, iItem_Limit
- // Get the Data from first Parameter in the native (Item Name)
- get_string(1, szItem_Name, charsmax(szItem_Name))
- // Get the Second Parameter (Item Cost)
- iItem_Cost = get_param(2)
- // Get limit third parameter
- iItem_Limit = get_param(3)
- if (strlen(szItem_Name) < 1)
- {
- // Can't leave item name empty
- log_error(AMX_ERR_NATIVE, "[ZE] Can't register item with an empty name")
- return ZE_WRONG_ITEM // Same as return -1
- }
- new iIndex, szItemName[32]
- // Loop from 0 to max items amount
- for (iIndex = 0; iIndex < g_iItemCount; iIndex++)
- {
- ArrayGetString(g_szItemRealName, iIndex, szItemName, charsmax(szItemName))
- if (equali(szItem_Name, szItemName))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Item already registered (%s)", szItemName)
- return ZE_WRONG_ITEM; // Return -1
- }
- }
- // Load settings from extra items file
- new szItemRealName[32]
- copy(szItemRealName, charsmax(szItemRealName), szItem_Name)
- ArrayPushString(g_szItemRealName, szItemRealName)
- // Name
- if (!amx_load_setting_string(ZE_EXTRAITEM_FILE, szItemRealName, "NAME", szItem_Name, charsmax(szItem_Name)))
- amx_save_setting_string(ZE_EXTRAITEM_FILE, szItemRealName, "NAME", szItem_Name)
- ArrayPushString(g_szItemName, szItem_Name)
- // Cost
- if (!amx_load_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "COST", iItem_Cost))
- amx_save_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "COST", iItem_Cost)
- ArrayPushCell(g_iItemCost, iItem_Cost)
- // Limit
- if (!amx_load_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "LIMIT", iItem_Limit))
- amx_save_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "LIMIT", iItem_Limit)
- ArrayPushCell(g_iItemLimit, iItem_Limit)
- g_iItemCount++
- return g_iItemCount - 1
- }
- public native_ze_show_items_menu(plugin_id, num_params)
- {
- new id = get_param(1)
- if (!is_user_connected(id))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
- return false;
- }
- Cmd_Items(id)
- return true
- }
- public native_ze_force_buy_item(plugin_id, num_params)
- {
- new id = get_param(1)
- if (!is_user_connected(id))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
- return false;
- }
- new item_id = get_param(2)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return false;
- }
- new ignorecost = get_param(3)
- Buy_Item(id, item_id, ignorecost)
- return true;
- }
- public native_ze_get_item_id(plugin_id, num_params)
- {
- new szRealName[32]
- get_string(1, szRealName, charsmax(szRealName))
- new index, szItemName[32]
- for (index = 0; index < g_iItemCount; index++)
- {
- ArrayGetString(g_szItemRealName, index, szItemName, charsmax(szItemName))
- if (equali(szRealName, szItemName))
- return index
- }
- return ZE_WRONG_ITEM
- }
- public native_ze_get_item_cost(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return ZE_WRONG_ITEM;
- }
- return ArrayGetCell(g_iItemCost, item_id);
- }
- public native_ze_add_text_to_item(plugin_id, num_params)
- {
- new szText[32]
- get_string(1, szText, charsmax(szText))
- format(g_szAdditionalMenuText, charsmax(g_szAdditionalMenuText), "%s%s", g_szAdditionalMenuText, szText)
- }
- public native_ze_get_item_limit(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return ZE_WRONG_ITEM;
- }
- return ArrayGetCell(g_iItemLimit, item_id);
- }
- public native_ze_is_valid_itemid(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- return false;
- }
- return true;
- }
- public native_ze_get_item_name(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return ZE_WRONG_ITEM;
- }
- new szName[32]
- ArrayGetString(g_szItemName, item_id, szName, charsmax(szName))
- new iLen = get_param(3)
- set_string(2, szName, iLen)
- return true;
- }
- public native_ze_set_vip_discount(iItemid, bool:bSet, Float:flDiscount)
- {
- g_bHasDiscount[iItemid] = bSet;
- g_flDiscountValue[iItemid] = flDiscount;
- }
- public native_ze_has_vip_discount(iItemid)
- {
- return g_bHasDiscount[iItemid]
- }
- public Float:native_ze_get_item_discount(iItemid)
- {
- return g_flDiscountValue[iItemid]
- }
- #include <zombie_escape>
- #include <ze_vip>
- native ze_has_vip_discount(iItemid)
- native Float:ze_get_item_discount(iItemid)
- new g_iCurrentEC,
- g_iRequiredEC
- public plugin_init()
- {
- register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS)
- }
- public ze_select_item_pre(id, itemid, ignorecost)
- {
- if (ignorecost)
- return ZE_ITEM_AVAILABLE
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- if (g_iCurrentEC < g_iRequiredEC)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid, ignorecost)
- {
- if (ignorecost)
- return
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC)
- }
- #include <zombie_escape>
- #include <engine>
- #include <fakemeta_util>
- #include <cstrike>
- #include <fun>
- #include <xs>
- native ze_set_vip_discount(iItemid, bool:bSet, Float:flDiscount);
- #define PLUGIN "[CSO] Dual Uzi"
- #define VERSION "1.0"
- #define AUTHOR "Dias Pendragon"
- // Data Config
- #define MODEL_V "models/v_dualuzi.mdl"
- #define MODEL_P "models/p_dualuzi.mdl"
- #define MODEL_W "models/w_dualuzi.mdl"
- #define MODEL_W_OLD "models/w_mp5.mdl"
- #define CSW_BASE CSW_MP5NAVY
- #define weapon_base "weapon_mp5navy"
- #define SUBMODEL -1 // can -1
- #define WEAPON_CODE 2102015
- #define WEAPON_EVENT "events/mp5n.sc"
- #define ANIM_EXT "dualpistols"
- #define ANIME_SHOOT 3
- #define ANIME_RELOAD 15 // can -1
- #define ANIME_DRAW 16 // can -1
- #define ANIME_IDLE random_num(0, 1) // can -1
- const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_AK47)|(1<<CSW_M4A1)|(1<<CSW_FAMAS)|(1<<CSW_GALIL)|(1<<CSW_SCOUT)|(1<<CSW_AWP)|(1<<CSW_M249)|(1<<CSW_MP5NAVY)|(1<<CSW_P90)|(1<<CSW_MAC10)|(1<<CSW_TMP)|(1<<CSW_XM1014)|(1<<CSW_M3)|(1<<CSW_G3SG1)|(1<<CSW_SG550)|(1<<CSW_SG552)|(1<<CSW_AUG)|(1<<CSW_UMP45);
- new const WeaponSounds[10][] =
- {
- "weapons/dualuzi-1.wav",
- "weapons/dualuzi_draw.wav",
- "weapons/dualuzi_idle2_1.wav",
- "weapons/dualuzi_idle2_2.wav",
- "weapons/dualuzi_clipin1.wav",
- "weapons/dualuzi_clipout1.wav",
- "weapons/dualuzi_off_shoulder.wav",
- "weapons/dualuzi_on_shoulder.wav",
- "weapons/dualuzi_on_shoulder_reload1.wav",
- "weapons/dualuzi_on_shoulder_reload2.wav"
- }
- enum
- {
- ANIME_IDLEX = 0,
- ANIME_IDLE2,
- ANIME_LEFT_EMPTY,
- ANIME_SHOOT_L1,
- ANIME_SHOOT_L2,
- ANIME_SHOOT_L3,
- ANIME_SHOOT_L4,
- ANIME_SHOOT_L5,
- ANIME_SHOOT_LLAST,
- ANIME_SHOOT_R1,
- ANIME_SHOOT_R2,
- ANIME_SHOOT_R3,
- ANIME_SHOOT_R4,
- ANIME_SHOOT_R5,
- ANIME_SHOOT_RLAST,
- ANIME_RELOADX,
- ANIME_DRAWX,
- ANIME_CHANGE_TO_B,
- ANIME_B_IDLE,
- ANIME_B_SHOOT_L,
- ANIME_B_SHOOT_LLAST,
- ANIME_B_LEFT_EMPTY,
- ANIME_B_SHOOT_R,
- ANIME_B_SHOOT_RLAST,
- ANIME_B_RELOAD,
- ANIME_CHANGE_TO_A
- }
- // Weapon Config
- #define DAMAGE 26 // 52 for Zombie
- #define ACCURACY 70 // 0 - 100 ; -1 Default
- #define CLIP 80
- #define BPAMMO 240
- #define SPEED 0.05
- #define RECOIL 0.5
- #define RELOAD_TIME 3.0
- // MACROS
- #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
- #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
- #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
- //new g_Base
- new g_Had_Base, g_Clip[33], g_OldWeapon[33], Float:g_Recoil[33][3]
- new g_Event_Base, g_SmokePuff_SprId, g_MsgCurWeapon, g_ShellId, g_iItemID
- // Safety
- new g_HamBot
- new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- // Safety
- Register_SafetyFunc()
- // Event
- register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
- // Forward
- register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
- register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
- register_forward(FM_SetModel, "fw_SetModel")
- register_forward(FM_CmdStart, "fw_CmdStart")
- // Ham
- RegisterHam(Ham_Item_Deploy, weapon_base, "fw_Item_Deploy_Post", 1)
- RegisterHam(Ham_Item_AddToPlayer, weapon_base, "fw_Item_AddToPlayer_Post", 1)
- RegisterHam(Ham_Weapon_WeaponIdle, weapon_base, "fw_Weapon_WeaponIdle_Post", 1)
- RegisterHam(Ham_Item_PostFrame, weapon_base, "fw_Item_PostFrame")
- RegisterHam(Ham_Weapon_Reload, weapon_base, "fw_Weapon_Reload")
- RegisterHam(Ham_Weapon_Reload, weapon_base, "fw_Weapon_Reload_Post", 1)
- RegisterHam(Ham_Weapon_PrimaryAttack, weapon_base, "fw_Weapon_PrimaryAttack")
- RegisterHam(Ham_Weapon_PrimaryAttack, weapon_base, "fw_Weapon_PrimaryAttack_Post", 1)
- RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World")
- RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player")
- // Cache
- g_MsgCurWeapon = get_user_msgid("CurWeapon")
- // Get
- g_iItemID = ze_register_item("Dual Uzi", 0, 0)
- ze_set_vip_discount(g_iItemID, true, 0.5)
- }
- public plugin_precache()
- {
- precache_model(MODEL_V)
- precache_model(MODEL_P)
- precache_model(MODEL_W)
- for(new i = 0; i < sizeof(WeaponSounds); i++)
- precache_sound(WeaponSounds[i])
- g_ShellId = engfunc(EngFunc_PrecacheModel, "models/pshell.mdl")
- g_SmokePuff_SprId = engfunc(EngFunc_PrecacheModel, "sprites/wall_puff1.spr")
- register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
- }
- public fw_PrecacheEvent_Post(type, const name[])
- {
- if(equal(WEAPON_EVENT, name)) g_Event_Base = get_orig_retval()
- }
- public client_putinserver(id)
- {
- Safety_Connected(id)
- if(!g_HamBot && is_user_bot(id))
- {
- g_HamBot = 1
- set_task(0.1, "Register_HamBot", id)
- }
- }
- public Register_HamBot(id)
- {
- Register_SafetyFuncBot(id)
- RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player")
- }
- public client_disconnected(id)
- {
- Safety_Disconnected(id)
- }
- /*
- public Mileage_WeaponGet(id, ItemID)
- {
- if(ItemID == g_Base) Get_Base(id)
- }
- public Mileage_WeaponRefillAmmo(id, ItemID)
- {
- if(ItemID == g_Base) cs_set_user_bpammo(id, CSW_BASE, BPAMMO)
- }
- public Mileage_WeaponRemove(id, ItemID)
- {
- if(ItemID == g_Base) Remove_Base(id)
- }*/
- public ze_select_item_pre(id, itemid)
- {
- if (itemid != g_iItemID)
- return ZE_ITEM_AVAILABLE
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- if (itemid != g_iItemID)
- return
- Get_Base(id)
- }
- public ze_user_humanized(id)
- {
- Remove_Base(id)
- }
- public Get_Base(id)
- {
- drop_weapons(id, 1);
- Set_BitVar(g_Had_Base, id)
- give_item(id, weapon_base)
- // Clip & Ammo
- static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(!pev_valid(Ent)) return
- cs_set_weapon_ammo(Ent, CLIP)
- cs_set_user_bpammo(id, CSW_BASE, BPAMMO)
- message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
- write_byte(1)
- write_byte(CSW_BASE)
- write_byte(CLIP)
- message_end()
- cs_set_weapon_silen(Ent, 0, 0)
- }
- public Remove_Base(id)
- {
- UnSet_BitVar(g_Had_Base, id)
- }
- public Event_CurWeapon(id)
- {
- static CSWID; CSWID = read_data(2)
- static SubModel; SubModel = SUBMODEL
- if((CSWID == CSW_BASE && g_OldWeapon[id] != CSW_BASE) && Get_BitVar(g_Had_Base, id))
- {
- if(SubModel != -1) Draw_NewWeapon(id, CSWID)
- } else if((CSWID == CSW_BASE && g_OldWeapon[id] == CSW_BASE) && Get_BitVar(g_Had_Base, id)) {
- static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(!pev_valid(Ent))
- {
- g_OldWeapon[id] = get_user_weapon(id)
- return
- }
- set_pdata_float(Ent, 46, SPEED, 4)
- set_pdata_float(Ent, 47, SPEED, 4)
- } else if(CSWID != CSW_BASE && g_OldWeapon[id] == CSW_BASE) {
- if(SubModel != -1) Draw_NewWeapon(id, CSWID)
- }
- g_OldWeapon[id] = get_user_weapon(id)
- }
- public Draw_NewWeapon(id, CSW_ID)
- {
- if(CSW_ID == CSW_BASE)
- {
- static ent
- ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(pev_valid(ent) && Get_BitVar(g_Had_Base, id))
- {
- set_pev(ent, pev_effects, pev(ent, pev_effects) &~ EF_NODRAW)
- engfunc(EngFunc_SetModel, ent, MODEL_P)
- set_pev(ent, pev_body, SUBMODEL)
- }
- } else {
- static ent
- ent = fm_get_user_weapon_entity(id, CSW_BASE)
- if(pev_valid(ent)) set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW)
- }
- }
- public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
- {
- if(!is_alive(id))
- return FMRES_IGNORED
- if(get_user_weapon(id) == CSW_BASE && Get_BitVar(g_Had_Base, id))
- set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
- return FMRES_HANDLED
- }
- public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
- {
- if (!is_connected(invoker))
- return FMRES_IGNORED
- if(get_player_weapon(invoker) != CSW_BASE || !Get_BitVar(g_Had_Base, invoker))
- return FMRES_IGNORED
- if(eventid != g_Event_Base)
- return FMRES_IGNORED
- engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
- DualAttack(invoker)
- return FMRES_SUPERCEDE
- }
- public DualAttack(id)
- {
- static iFlags, iAnimDesired, iWeaponState, iItem, szAnimation[64]
- #define WEAPONSTATE_ELITE_LEFT (1 << 3)
- iItem = fm_get_user_weapon_entity(id, CSW_BASE)
- if(!pev_valid(iItem)) return
- iFlags = pev(id, pev_flags);
- iWeaponState = get_pdata_int(iItem, 74, 4)
- if(iWeaponState & WEAPONSTATE_ELITE_LEFT)
- {
- iWeaponState &= ~ WEAPONSTATE_ELITE_LEFT;
- Set_WeaponAnim(id, ANIME_SHOOT_L1)
- Make_Shell(id, 1)
- formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot_%s" : "ref_shoot_%s", ANIM_EXT);
- } else {
- iWeaponState |= WEAPONSTATE_ELITE_LEFT;
- Set_WeaponAnim(id, ANIME_SHOOT_R1)
- Make_Shell(id, 0)
- formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot2_%s" : "ref_shoot2_%s", ANIM_EXT);
- }
- if((iAnimDesired = lookup_sequence(id, szAnimation)) == -1)
- iAnimDesired = 0;
- set_pev(id, pev_sequence, iAnimDesired)
- set_pdata_int(iItem, 74, iWeaponState, 4)
- emit_sound(id, CHAN_WEAPON, WeaponSounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15))
- }
- public Make_Shell(id, Right)
- {
- static Float:player_origin[3], Float:origin[3], Float:origin2[3], Float:gunorigin[3], Float:oldangles[3], Float:v_forward[3], Float:v_forward2[3], Float:v_up[3], Float:v_up2[3], Float:v_right[3], Float:v_right2[3], Float:viewoffsets[3];
- pev(id, pev_v_angle, oldangles); pev(id,pev_origin,player_origin); pev(id, pev_view_ofs, viewoffsets);
- engfunc(EngFunc_MakeVectors, oldangles)
- global_get(glb_v_forward, v_forward); global_get(glb_v_up, v_up); global_get(glb_v_right, v_right);
- global_get(glb_v_forward, v_forward2); global_get(glb_v_up, v_up2); global_get(glb_v_right, v_right2);
- xs_vec_add(player_origin, viewoffsets, gunorigin);
- if(!Right)
- {
- xs_vec_mul_scalar(v_forward, 10.3, v_forward); xs_vec_mul_scalar(v_right, 2.0, v_right);
- xs_vec_mul_scalar(v_up, -2.7, v_up);
- xs_vec_mul_scalar(v_forward2, 10.0, v_forward2); xs_vec_mul_scalar(v_right2, 4.0, v_right2);
- xs_vec_mul_scalar(v_up2, -3.0, v_up2);
- } else {
- xs_vec_mul_scalar(v_forward, 10.3, v_forward); xs_vec_mul_scalar(v_right, -4.0, v_right);
- xs_vec_mul_scalar(v_up, -3.7, v_up);
- xs_vec_mul_scalar(v_forward2, 10.0, v_forward2); xs_vec_mul_scalar(v_right2, 2.0, v_right2);
- xs_vec_mul_scalar(v_up2, -4.0, v_up2);
- }
- xs_vec_add(gunorigin, v_forward, origin);
- xs_vec_add(gunorigin, v_forward2, origin2);
- xs_vec_add(origin, v_right, origin);
- xs_vec_add(origin2, v_right2, origin2);
- xs_vec_add(origin, v_up, origin);
- xs_vec_add(origin2, v_up2, origin2);
- static Float:velocity[3]
- get_speed_vector(origin2, origin, random_float(140.0, 160.0), velocity)
- static angle; angle = random_num(0, 360)
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_MODEL)
- engfunc(EngFunc_WriteCoord, origin[0])
- engfunc(EngFunc_WriteCoord,origin[1])
- engfunc(EngFunc_WriteCoord,origin[2])
- engfunc(EngFunc_WriteCoord,velocity[0])
- engfunc(EngFunc_WriteCoord,velocity[1])
- engfunc(EngFunc_WriteCoord,velocity[2])
- write_angle(angle)
- write_short(g_ShellId)
- write_byte(1)
- write_byte(20)
- message_end()
- }
- public fw_SetModel(entity, model[])
- {
- if(!pev_valid(entity))
- return FMRES_IGNORED
- static Classname[32]
- pev(entity, pev_classname, Classname, sizeof(Classname))
- if(!equal(Classname, "weaponbox"))
- return FMRES_IGNORED
- static iOwner
- iOwner = pev(entity, pev_owner)
- if(equal(model, MODEL_W_OLD))
- {
- static weapon; weapon = find_ent_by_owner(-1, weapon_base, entity)
- if(!pev_valid(weapon))
- return FMRES_IGNORED;
- if(Get_BitVar(g_Had_Base, iOwner))
- {
- set_pev(weapon, pev_impulse, WEAPON_CODE)
- engfunc(EngFunc_SetModel, entity, MODEL_W)
- set_pev(entity, pev_body, SUBMODEL)
- Remove_Base(iOwner)
- return FMRES_SUPERCEDE
- }
- }
- return FMRES_IGNORED;
- }
- public fw_CmdStart(id, uc_handle, seed)
- {
- if (!is_alive(id))
- return FMRES_IGNORED
- if(get_player_weapon(id) != CSW_BASE || !Get_BitVar(g_Had_Base, id))
- return FMRES_IGNORED
- static Button; Button = get_uc(uc_handle, UC_Buttons)
- if(Button & IN_ATTACK2)
- {
- static Float:Time; Time = get_pdata_float(id, 83, 5)
- if(Time > 0.0) return FMRES_IGNORED
- if(cs_get_user_zoom(id) != CS_SET_AUGSG552_ZOOM) cs_set_user_zoom(id, CS_SET_AUGSG552_ZOOM, 1)
- else cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
- Time = 0.25
- set_pdata_float(id, 83, Time, 5)
- }
- return FMRES_IGNORED
- }
- public fw_Item_Deploy_Post(Ent)
- {
- if(pev_valid(Ent) != 2)
- return
- static Id; Id = get_pdata_cbase(Ent, 41, 4)
- if(get_pdata_cbase(Id, 373) != Ent)
- return
- if(!Get_BitVar(g_Had_Base, Id))
- return
- static SubModel; SubModel = SUBMODEL
- set_pev(Id, pev_viewmodel2, MODEL_V)
- set_pev(Id, pev_weaponmodel2, SubModel != -1 ? "" : MODEL_P)
- static Draw; Draw = ANIME_DRAW
- if(Draw != -1) Set_WeaponAnim(Id, ANIME_DRAW)
- set_pdata_string(Id, (492) * 4, ANIM_EXT, -1 , 20)
- }
- public fw_Item_AddToPlayer_Post(Ent, id)
- {
- if(!pev_valid(Ent))
- return HAM_IGNORED
- if(pev(Ent, pev_impulse) == WEAPON_CODE)
- {
- Set_BitVar(g_Had_Base, id)
- set_pev(Ent, pev_impulse, 0)
- }
- return HAM_HANDLED
- }
- public fw_Item_PostFrame(ent)
- {
- static id; id = pev(ent, pev_owner)
- if(!is_user_alive(id))
- return HAM_IGNORED
- if(!Get_BitVar(g_Had_Base, id))
- return HAM_IGNORED
- static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5)
- static bpammo; bpammo = cs_get_user_bpammo(id, CSW_BASE)
- static iClip; iClip = get_pdata_int(ent, 51, 4)
- static fInReload; fInReload = get_pdata_int(ent, 54, 4)
- if(fInReload && flNextAttack <= 0.0)
- {
- static temp1
- temp1 = min(CLIP - iClip, bpammo)
- set_pdata_int(ent, 51, iClip + temp1, 4)
- cs_set_user_bpammo(id, CSW_BASE, bpammo - temp1)
- set_pdata_int(ent, 54, 0, 4)
- fInReload = 0
- }
- return HAM_IGNORED
- }
- public fw_Weapon_Reload(ent)
- {
- static id; id = pev(ent, pev_owner)
- if(!is_user_alive(id))
- return HAM_IGNORED
- if(!Get_BitVar(g_Had_Base, id))
- return HAM_IGNORED
- g_Clip[id] = -1
- static BPAmmo; BPAmmo = cs_get_user_bpammo(id, CSW_BASE)
- static iClip; iClip = get_pdata_int(ent, 51, 4)
- if(BPAmmo <= 0)
- return HAM_SUPERCEDE
- if(iClip >= CLIP)
- return HAM_SUPERCEDE
- g_Clip[id] = iClip
- return HAM_HANDLED
- }
- public fw_Weapon_Reload_Post(ent)
- {
- static id; id = pev(ent, pev_owner)
- if(!is_user_alive(id))
- return HAM_IGNORED
- if(!Get_BitVar(g_Had_Base, id))
- return HAM_IGNORED
- if((get_pdata_int(ent, 54, 4) == 1))
- { // Reload
- if(g_Clip[id] == -1)
- return HAM_IGNORED
- set_pdata_int(ent, 51, g_Clip[id], 4)
- static Reload; Reload = ANIME_RELOAD
- if(Reload != -1) Set_WeaponAnim(id, ANIME_RELOAD)
- Set_PlayerNextAttack(id, RELOAD_TIME)
- }
- return HAM_HANDLED
- }
- public fw_Weapon_WeaponIdle_Post( iEnt )
- {
- if(pev_valid(iEnt) != 2)
- return
- static Id; Id = get_pdata_cbase(iEnt, 41, 4)
- if(get_pdata_cbase(Id, 373) != iEnt)
- return
- if(!Get_BitVar(g_Had_Base, Id))
- return
- static Idle; Idle = ANIME_IDLE
- if(Idle != -1 && get_pdata_float(iEnt, 48, 4) <= 0.25)
- {
- Set_WeaponAnim(Id, ANIME_IDLE)
- set_pdata_float(iEnt, 48, 20.0, 4)
- }
- }
- public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
- {
- if(!is_connected(Attacker))
- return HAM_IGNORED
- if(get_player_weapon(Attacker) != CSW_BASE || !Get_BitVar(g_Had_Base, Attacker))
- return HAM_IGNORED
- static Float:flEnd[3], Float:vecPlane[3]
- get_tr2(Ptr, TR_vecEndPos, flEnd)
- get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)
- Make_BulletHole(Attacker, flEnd, Damage)
- Make_BulletSmoke(Attacker, Ptr)
- SetHamParamFloat(3, float(DAMAGE))
- return HAM_HANDLED
- }
- public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits)
- {
- if(!is_connected(Attacker))
- return HAM_IGNORED
- if(get_player_weapon(Attacker) != CSW_BASE || !Get_BitVar(g_Had_Base, Attacker))
- return HAM_IGNORED
- static Float:flEnd[3]
- get_tr2(Ptr, TR_vecEndPos, flEnd)
- SetHamParamFloat(3, float(DAMAGE))
- return HAM_HANDLED
- }
- public fw_Weapon_PrimaryAttack(Ent)
- {
- static id; id = pev(Ent, pev_owner)
- if(!is_alive(id))
- return
- if(!Get_BitVar(g_Had_Base, id))
- return
- pev(id, pev_punchangle, g_Recoil[id])
- }
- public fw_Weapon_PrimaryAttack_Post(Ent)
- {
- static id; id = pev(Ent, pev_owner)
- if(!is_alive(id))
- return
- if(!Get_BitVar(g_Had_Base, id))
- return
- static Float:Push[3]
- pev(id, pev_punchangle, Push)
- xs_vec_sub(Push, g_Recoil[id], Push)
- xs_vec_mul_scalar(Push, RECOIL, Push)
- xs_vec_add(Push, g_Recoil[id], Push)
- set_pev(id, pev_punchangle, Push)
- // Acc
- static Accena; Accena = ACCURACY
- if(Accena != -1)
- {
- static Float:Accuracy
- Accuracy = (float(100 - ACCURACY) * 1.5) / 100.0
- set_pdata_float(Ent, 62, Accuracy, 4);
- }
- }
- /* ===============================
- ------------- SAFETY -------------
- =================================*/
- public Register_SafetyFunc()
- {
- register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
- RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
- RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
- }
- public Register_SafetyFuncBot(id)
- {
- RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
- RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
- }
- public Safety_Connected(id)
- {
- Set_BitVar(g_IsConnected, id)
- UnSet_BitVar(g_IsAlive, id)
- g_PlayerWeapon[id] = 0
- }
- public Safety_Disconnected(id)
- {
- UnSet_BitVar(g_IsConnected, id)
- UnSet_BitVar(g_IsAlive, id)
- g_PlayerWeapon[id] = 0
- }
- public Safety_CurWeapon(id)
- {
- if(!is_alive(id))
- return
- static CSW; CSW = read_data(2)
- if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
- }
- public fw_Safety_Spawn_Post(id)
- {
- if(!is_user_alive(id))
- return
- Set_BitVar(g_IsAlive, id)
- }
- public fw_Safety_Killed_Post(id)
- {
- UnSet_BitVar(g_IsAlive, id)
- }
- public is_connected(id)
- {
- if(!(1 <= id <= 32))
- return 0
- if(!Get_BitVar(g_IsConnected, id))
- return 0
- return 1
- }
- public is_alive(id)
- {
- if(!is_connected(id))
- return 0
- if(!Get_BitVar(g_IsAlive, id))
- return 0
- return 1
- }
- public get_player_weapon(id)
- {
- if(!is_alive(id))
- return 0
- return g_PlayerWeapon[id]
- }
- /* ===============================
- --------- END OF SAFETY ---------
- =================================*/
- stock Set_WeaponAnim(id, anim)
- {
- set_pev(id, pev_weaponanim, anim)
- message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
- write_byte(anim)
- write_byte(pev(id, pev_body))
- message_end()
- }
- stock Make_BulletHole(id, Float:Origin[3], Float:Damage)
- {
- // Find target
- static Decal; Decal = random_num(41, 45)
- static LoopTime;
- if(Damage > 100.0) LoopTime = 2
- else LoopTime = 1
- for(new i = 0; i < LoopTime; i++)
- {
- // Put decal on "world" (a wall)
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_WORLDDECAL)
- engfunc(EngFunc_WriteCoord, Origin[0])
- engfunc(EngFunc_WriteCoord, Origin[1])
- engfunc(EngFunc_WriteCoord, Origin[2])
- write_byte(Decal)
- message_end()
- // Show sparcles
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_GUNSHOTDECAL)
- engfunc(EngFunc_WriteCoord, Origin[0])
- engfunc(EngFunc_WriteCoord, Origin[1])
- engfunc(EngFunc_WriteCoord, Origin[2])
- write_short(id)
- write_byte(Decal)
- message_end()
- }
- }
- stock Make_BulletSmoke(id, TrResult)
- {
- static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG
- get_weapon_attachment(id, vecSrc)
- global_get(glb_v_forward, vecEnd)
- xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd)
- xs_vec_add(vecSrc, vecEnd, vecEnd)
- get_tr2(TrResult, TR_vecEndPos, vecSrc)
- get_tr2(TrResult, TR_vecPlaneNormal, vecEnd)
- xs_vec_mul_scalar(vecEnd, 2.5, vecEnd)
- xs_vec_add(vecSrc, vecEnd, vecEnd)
- TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
- TE_FLAG |= TE_EXPLFLAG_NOSOUND
- TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
- engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0)
- write_byte(TE_EXPLOSION)
- engfunc(EngFunc_WriteCoord, vecEnd[0])
- engfunc(EngFunc_WriteCoord, vecEnd[1])
- engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0)
- write_short(g_SmokePuff_SprId)
- write_byte(2)
- write_byte(50)
- write_byte(TE_FLAG)
- message_end()
- }
- stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
- {
- static Float:vfEnd[3], viEnd[3]
- get_user_origin(id, viEnd, 3)
- IVecFVec(viEnd, vfEnd)
- static Float:fOrigin[3], Float:fAngle[3]
- pev(id, pev_origin, fOrigin)
- pev(id, pev_view_ofs, fAngle)
- xs_vec_add(fOrigin, fAngle, fOrigin)
- static Float:fAttack[3]
- xs_vec_sub(vfEnd, fOrigin, fAttack)
- xs_vec_sub(vfEnd, fOrigin, fAttack)
- static Float:fRate
- fRate = fDis / vector_length(fAttack)
- xs_vec_mul_scalar(fAttack, fRate, fAttack)
- xs_vec_add(fOrigin, fAttack, output)
- }
- stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
- {
- new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
- pev(id, pev_origin, vOrigin)
- pev(id, pev_view_ofs,vUp) //for player
- xs_vec_add(vOrigin,vUp,vOrigin)
- pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
- angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
- angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
- angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
- vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
- vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
- vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
- }
- stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
- {
- new_velocity[0] = origin2[0] - origin1[0]
- new_velocity[1] = origin2[1] - origin1[1]
- new_velocity[2] = origin2[2] - origin1[2]
- new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
- new_velocity[0] *= num
- new_velocity[1] *= num
- new_velocity[2] *= num
- return 1;
- }
- stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
- {
- static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
- if(!pev_valid(entwpn))
- return
- set_pdata_float(entwpn, 46, TimeIdle, 4)
- set_pdata_float(entwpn, 47, TimeIdle, 4)
- set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
- }
- stock Set_PlayerNextAttack(id, Float:nexttime)
- {
- set_pdata_float(id, 83, nexttime, 5)
- }
- stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[])
- {
- static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
- pev(id, pev_origin, vOrigin)
- pev(id, pev_view_ofs,vUp) //for player
- xs_vec_add(vOrigin,vUp,vOrigin)
- pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
- angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
- angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
- angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
- vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
- vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
- vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
- }
- stock drop_weapons(id, dropwhat)
- {
- static weapons[32], num, i, weaponid
- num = 0
- get_user_weapons(id, weapons, num)
- for (i = 0; i < num; i++)
- {
- weaponid = weapons[i]
- if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
- {
- static wname[32]
- get_weaponname(weaponid, wname, sizeof wname - 1)
- engclient_cmd(id, "drop", wname)
- }
- }
- }
Last edited by Raheem 5 years ago, edited 3 times in total.
Reason: OH, forget define native type :(
Reason: OH, forget define native type :(
He who fails to plan is planning to fail
//// ze_items_manager.smaRaheem wrote: ↑5 years ago OK TRY:
1. ze_items_manager.sma2. ze_items_escape_coins.sma
#include <zombie_escape> // Setting File new const ZE_EXTRAITEM_FILE[] = "ze_extraitems.ini" // Defines #define MENU_PAGE_ITEMS g_iMenuData[id] // Const const OFFSET_CSMENUCODE = 205 // Forwards enum _:TOTAL_FORWARDS { FW_ITEM_SELECT_PRE = 0, FW_ITEM_SELECT_POST } new g_iForwards[TOTAL_FORWARDS], g_iForwardReturn // Variables new Array:g_szItemRealName, Array:g_szItemName, Array:g_iItemCost, Array:g_iItemLimit new g_iItemCount, g_szAdditionalMenuText[32], g_iMenuData[33], bool:g_bHasDiscount[MAX_EXTRA_ITEMS] public plugin_init() { register_plugin("[ZE] Items Manager", ZE_VERSION, AUTHORS) // Commands register_clcmd("say /items", "Cmd_Items") // Forwards (In Pre Return Values important) g_iForwards[FW_ITEM_SELECT_PRE] = CreateMultiForward("ze_select_item_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL) g_iForwards[FW_ITEM_SELECT_POST] = CreateMultiForward("ze_select_item_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL) } public plugin_natives() { register_native("ze_register_item", "native_ze_register_item") register_native("ze_show_items_menu", "native_ze_show_items_menu") register_native("ze_force_buy_item", "native_ze_force_buy_item") register_native("ze_get_item_id", "native_ze_get_item_id") register_native("ze_get_item_cost", "native_ze_get_item_cost") register_native("ze_add_text_to_item", "native_ze_add_text_to_item") register_native("ze_get_item_limit", "native_ze_get_item_limit") register_native("ze_is_valid_itemid", "native_ze_is_valid_itemid") register_native("ze_get_item_name", "native_ze_get_item_name") register_native("ze_set_vip_discount", "native_ze_set_vip_discount") register_native("ze_has_vip_discount", "native_ze_has_vip_discount") g_szItemRealName = ArrayCreate(32, 1) g_szItemName = ArrayCreate(32, 1) g_iItemCost = ArrayCreate(1, 1) g_iItemLimit = ArrayCreate(1, 1) } public client_disconnected(id) { MENU_PAGE_ITEMS = 0 } public Cmd_Items(id) { if (!is_user_alive(id)) return Show_Items_Menu(id) } // Items Menu Show_Items_Menu(id) { static menu[128], name[32], cost, transkey[64] new menuid, index, itemdata[2] // Title formatex(menu, charsmax(menu), "%L:\r", id, "BUY_EXTRAITEM") menuid = menu_create(menu, "Extra_Items_Menu") // Item List for (index = 0; index < g_iItemCount; index++) { // Additional text to display g_szAdditionalMenuText[0] = 0 // Execute item select attempt forward ExecuteForward(g_iForwards[FW_ITEM_SELECT_PRE], g_iForwardReturn, id, index, 0) // Show item to player? if (g_iForwardReturn >= ZE_ITEM_DONT_SHOW) continue; // Add Item Name and Cost ArrayGetString(g_szItemName, index, name, charsmax(name)) cost = ArrayGetCell(g_iItemCost, index) // ML support for item name formatex(transkey, charsmax(transkey), "ITEMNAME %s", name) if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey) // Item available to player? if (g_iForwardReturn >= ZE_ITEM_UNAVAILABLE) formatex(menu, charsmax(menu), "\d%s %d %s", name, cost, g_szAdditionalMenuText) else formatex(menu, charsmax(menu), "%s \y%d \w%s", name, cost, g_szAdditionalMenuText) itemdata[0] = index itemdata[1] = 0 menu_additem(menuid, menu, itemdata) } // No items to display? if (menu_items(menuid) <= 0) { ze_colored_print(id, "%L", id, "NO_EXTRA_ITEMS") menu_destroy(menuid) return; } // Back - Next - Exit formatex(menu, charsmax(menu), "%L", id, "BACK") menu_setprop(menuid, MPROP_BACKNAME, menu) formatex(menu, charsmax(menu), "%L", id, "NEXT") menu_setprop(menuid, MPROP_NEXTNAME, menu) formatex(menu, charsmax(menu), "%L", id, "EXIT") menu_setprop(menuid, MPROP_EXITNAME, menu) // If remembered page is greater than number of pages, clamp down the value MENU_PAGE_ITEMS = min(MENU_PAGE_ITEMS, menu_pages(menuid)-1) // Fix for AMXX custom menus set_pdata_int(id, OFFSET_CSMENUCODE, 0) menu_display(id, menuid, MENU_PAGE_ITEMS) } // Items Menu public Extra_Items_Menu(id, menuid, item) { // Menu was closed if (item == MENU_EXIT) { MENU_PAGE_ITEMS = 0 menu_destroy(menuid) return PLUGIN_HANDLED; } // Remember items menu page MENU_PAGE_ITEMS = item / 7 // Dead players are not allowed to buy items if (!is_user_alive(id)) { menu_destroy(menuid) return PLUGIN_HANDLED; } // Retrieve item id new itemdata[2], dummy, itemid menu_item_getinfo(menuid, item, dummy, itemdata, charsmax(itemdata), _, _, dummy) itemid = itemdata[0] // Attempt to buy the item Buy_Item(id, itemid) menu_destroy(menuid) return PLUGIN_HANDLED; } // Buy Item Buy_Item(id, itemid, ignorecost = 0) { // Execute item select attempt forward ExecuteForward(g_iForwards[FW_ITEM_SELECT_PRE], g_iForwardReturn, id, itemid, ignorecost) // Item available to player? if (g_iForwardReturn >= ZE_ITEM_UNAVAILABLE) return; // Execute item selected forward ExecuteForward(g_iForwards[FW_ITEM_SELECT_POST], g_iForwardReturn, id, itemid, ignorecost) } // Natives public native_ze_register_item(plugin_id, num_params) { new szItem_Name[32], iItem_Cost, iItem_Limit // Get the Data from first Parameter in the native (Item Name) get_string(1, szItem_Name, charsmax(szItem_Name)) // Get the Second Parameter (Item Cost) iItem_Cost = get_param(2) // Get limit third parameter iItem_Limit = get_param(3) if (strlen(szItem_Name) < 1) { // Can't leave item name empty log_error(AMX_ERR_NATIVE, "[ZE] Can't register item with an empty name") return ZE_WRONG_ITEM // Same as return -1 } new iIndex, szItemName[32] // Loop from 0 to max items amount for (iIndex = 0; iIndex < g_iItemCount; iIndex++) { ArrayGetString(g_szItemRealName, iIndex, szItemName, charsmax(szItemName)) if (equali(szItem_Name, szItemName)) { log_error(AMX_ERR_NATIVE, "[ZE] Item already registered (%s)", szItemName) return ZE_WRONG_ITEM; // Return -1 } } // Load settings from extra items file new szItemRealName[32] copy(szItemRealName, charsmax(szItemRealName), szItem_Name) ArrayPushString(g_szItemRealName, szItemRealName) // Name if (!amx_load_setting_string(ZE_EXTRAITEM_FILE, szItemRealName, "NAME", szItem_Name, charsmax(szItem_Name))) amx_save_setting_string(ZE_EXTRAITEM_FILE, szItemRealName, "NAME", szItem_Name) ArrayPushString(g_szItemName, szItem_Name) // Cost if (!amx_load_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "COST", iItem_Cost)) amx_save_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "COST", iItem_Cost) ArrayPushCell(g_iItemCost, iItem_Cost) // Limit if (!amx_load_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "LIMIT", iItem_Limit)) amx_save_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "LIMIT", iItem_Limit) ArrayPushCell(g_iItemLimit, iItem_Limit) g_iItemCount++ return g_iItemCount - 1 } public native_ze_show_items_menu(plugin_id, num_params) { new id = get_param(1) if (!is_user_connected(id)) { log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id) return false; } Cmd_Items(id) return true } public native_ze_force_buy_item(plugin_id, num_params) { new id = get_param(1) if (!is_user_connected(id)) { log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id) return false; } new item_id = get_param(2) if (item_id < 0 || item_id >= g_iItemCount) { log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id) return false; } new ignorecost = get_param(3) Buy_Item(id, item_id, ignorecost) return true; } public native_ze_get_item_id(plugin_id, num_params) { new szRealName[32] get_string(1, szRealName, charsmax(szRealName)) new index, szItemName[32] for (index = 0; index < g_iItemCount; index++) { ArrayGetString(g_szItemRealName, index, szItemName, charsmax(szItemName)) if (equali(szRealName, szItemName)) return index } return ZE_WRONG_ITEM } public native_ze_get_item_cost(plugin_id, num_params) { new item_id = get_param(1) if (item_id < 0 || item_id >= g_iItemCount) { log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id) return ZE_WRONG_ITEM; } return ArrayGetCell(g_iItemCost, item_id); } public native_ze_add_text_to_item(plugin_id, num_params) { new szText[32] get_string(1, szText, charsmax(szText)) format(g_szAdditionalMenuText, charsmax(g_szAdditionalMenuText), "%s%s", g_szAdditionalMenuText, szText) } public native_ze_get_item_limit(plugin_id, num_params) { new item_id = get_param(1) if (item_id < 0 || item_id >= g_iItemCount) { log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id) return ZE_WRONG_ITEM; } return ArrayGetCell(g_iItemLimit, item_id); } public native_ze_is_valid_itemid(plugin_id, num_params) { new item_id = get_param(1) if (item_id < 0 || item_id >= g_iItemCount) { return false; } return true; } public native_ze_get_item_name(plugin_id, num_params) { new item_id = get_param(1) if (item_id < 0 || item_id >= g_iItemCount) { log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id) return ZE_WRONG_ITEM; } new szName[32] ArrayGetString(g_szItemName, item_id, szName, charsmax(szName)) new iLen = get_param(3) set_string(2, szName, iLen) return true; } public native_ze_set_vip_discount(iItemid, bSet) { g_bHasDiscount[iItemid] = bSet; } public native_ze_has_vip_discount(iItemid) { return g_bHasDiscount[iItemid] }3. Item:
#include <zombie_escape> #include <ze_vip> native ze_has_vip_discount(iItemid) new g_iCurrentEC, g_iRequiredEC public plugin_init() { register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS) } public ze_select_item_pre(id, itemid, ignorecost) { if (ignorecost) return ZE_ITEM_AVAILABLE g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id) && ze_has_vip_discount(iItemid)) { g_iRequiredEC = floatround(ze_get_item_cost(itemid) * 0.5) // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } if (g_iCurrentEC < g_iRequiredEC) return ZE_ITEM_UNAVAILABLE return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid, ignorecost) { if (ignorecost) return g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id) && ze_has_vip_discount(iItemid)) { g_iRequiredEC = floatround(ze_get_item_cost(itemid) * 0.5) // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC) }
#include <zombie_escape> #include <engine> #include <fakemeta_util> #include <cstrike> #include <fun> #include <xs> native ze_set_vip_discount(iItemid, bSet); #define PLUGIN "[CSO] Dual Uzi" #define VERSION "1.0" #define AUTHOR "Dias Pendragon" // Data Config #define MODEL_V "models/v_dualuzi.mdl" #define MODEL_P "models/p_dualuzi.mdl" #define MODEL_W "models/w_dualuzi.mdl" #define MODEL_W_OLD "models/w_mp5.mdl" #define CSW_BASE CSW_MP5NAVY #define weapon_base "weapon_mp5navy" #define SUBMODEL -1 // can -1 #define WEAPON_CODE 2102015 #define WEAPON_EVENT "events/mp5n.sc" #define ANIM_EXT "dualpistols" #define ANIME_SHOOT 3 #define ANIME_RELOAD 15 // can -1 #define ANIME_DRAW 16 // can -1 #define ANIME_IDLE random_num(0, 1) // can -1 const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_AK47)|(1<<CSW_M4A1)|(1<<CSW_FAMAS)|(1<<CSW_GALIL)|(1<<CSW_SCOUT)|(1<<CSW_AWP)|(1<<CSW_M249)|(1<<CSW_MP5NAVY)|(1<<CSW_P90)|(1<<CSW_MAC10)|(1<<CSW_TMP)|(1<<CSW_XM1014)|(1<<CSW_M3)|(1<<CSW_G3SG1)|(1<<CSW_SG550)|(1<<CSW_SG552)|(1<<CSW_AUG)|(1<<CSW_UMP45); new const WeaponSounds[10][] = { "weapons/dualuzi-1.wav", "weapons/dualuzi_draw.wav", "weapons/dualuzi_idle2_1.wav", "weapons/dualuzi_idle2_2.wav", "weapons/dualuzi_clipin1.wav", "weapons/dualuzi_clipout1.wav", "weapons/dualuzi_off_shoulder.wav", "weapons/dualuzi_on_shoulder.wav", "weapons/dualuzi_on_shoulder_reload1.wav", "weapons/dualuzi_on_shoulder_reload2.wav" } enum { ANIME_IDLEX = 0, ANIME_IDLE2, ANIME_LEFT_EMPTY, ANIME_SHOOT_L1, ANIME_SHOOT_L2, ANIME_SHOOT_L3, ANIME_SHOOT_L4, ANIME_SHOOT_L5, ANIME_SHOOT_LLAST, ANIME_SHOOT_R1, ANIME_SHOOT_R2, ANIME_SHOOT_R3, ANIME_SHOOT_R4, ANIME_SHOOT_R5, ANIME_SHOOT_RLAST, ANIME_RELOADX, ANIME_DRAWX, ANIME_CHANGE_TO_B, ANIME_B_IDLE, ANIME_B_SHOOT_L, ANIME_B_SHOOT_LLAST, ANIME_B_LEFT_EMPTY, ANIME_B_SHOOT_R, ANIME_B_SHOOT_RLAST, ANIME_B_RELOAD, ANIME_CHANGE_TO_A } // Weapon Config #define DAMAGE 26 // 52 for Zombie #define ACCURACY 70 // 0 - 100 ; -1 Default #define CLIP 80 #define BPAMMO 240 #define SPEED 0.05 #define RECOIL 0.5 #define RELOAD_TIME 3.0 // MACROS #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31))) #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31)) #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31)) //new g_Base new g_Had_Base, g_Clip[33], g_OldWeapon[33], Float:g_Recoil[33][3] new g_Event_Base, g_SmokePuff_SprId, g_MsgCurWeapon, g_ShellId, g_iItemID // Safety new g_HamBot new g_IsConnected, g_IsAlive, g_PlayerWeapon[33] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) // Safety Register_SafetyFunc() // Event register_event("CurWeapon", "Event_CurWeapon", "be", "1=1") // Forward register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1) register_forward(FM_PlaybackEvent, "fw_PlaybackEvent") register_forward(FM_SetModel, "fw_SetModel") register_forward(FM_CmdStart, "fw_CmdStart") // Ham RegisterHam(Ham_Item_Deploy, weapon_base, "fw_Item_Deploy_Post", 1) RegisterHam(Ham_Item_AddToPlayer, weapon_base, "fw_Item_AddToPlayer_Post", 1) RegisterHam(Ham_Weapon_WeaponIdle, weapon_base, "fw_Weapon_WeaponIdle_Post", 1) RegisterHam(Ham_Item_PostFrame, weapon_base, "fw_Item_PostFrame") RegisterHam(Ham_Weapon_Reload, weapon_base, "fw_Weapon_Reload") RegisterHam(Ham_Weapon_Reload, weapon_base, "fw_Weapon_Reload_Post", 1) RegisterHam(Ham_Weapon_PrimaryAttack, weapon_base, "fw_Weapon_PrimaryAttack") RegisterHam(Ham_Weapon_PrimaryAttack, weapon_base, "fw_Weapon_PrimaryAttack_Post", 1) RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_World") RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Player") // Cache g_MsgCurWeapon = get_user_msgid("CurWeapon") // Get g_iItemID = ze_register_item("Dual Uzi", 0, 0) ze_set_vip_discount(g_iItemID, true) } public plugin_precache() { precache_model(MODEL_V) precache_model(MODEL_P) precache_model(MODEL_W) for(new i = 0; i < sizeof(WeaponSounds); i++) precache_sound(WeaponSounds[i]) g_ShellId = engfunc(EngFunc_PrecacheModel, "models/pshell.mdl") g_SmokePuff_SprId = engfunc(EngFunc_PrecacheModel, "sprites/wall_puff1.spr") register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1) } public fw_PrecacheEvent_Post(type, const name[]) { if(equal(WEAPON_EVENT, name)) g_Event_Base = get_orig_retval() } public client_putinserver(id) { Safety_Connected(id) if(!g_HamBot && is_user_bot(id)) { g_HamBot = 1 set_task(0.1, "Register_HamBot", id) } } public Register_HamBot(id) { Register_SafetyFuncBot(id) RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Player") } public client_disconnected(id) { Safety_Disconnected(id) } /* public Mileage_WeaponGet(id, ItemID) { if(ItemID == g_Base) Get_Base(id) } public Mileage_WeaponRefillAmmo(id, ItemID) { if(ItemID == g_Base) cs_set_user_bpammo(id, CSW_BASE, BPAMMO) } public Mileage_WeaponRemove(id, ItemID) { if(ItemID == g_Base) Remove_Base(id) }*/ public ze_select_item_pre(id, itemid) { if (itemid != g_iItemID) return ZE_ITEM_AVAILABLE if (ze_is_user_zombie(id)) return ZE_ITEM_DONT_SHOW return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid) { if (itemid != g_iItemID) return Get_Base(id) } public ze_user_humanized(id) { Remove_Base(id) } public Get_Base(id) { drop_weapons(id, 1); Set_BitVar(g_Had_Base, id) give_item(id, weapon_base) // Clip & Ammo static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASE) if(!pev_valid(Ent)) return cs_set_weapon_ammo(Ent, CLIP) cs_set_user_bpammo(id, CSW_BASE, BPAMMO) message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id) write_byte(1) write_byte(CSW_BASE) write_byte(CLIP) message_end() cs_set_weapon_silen(Ent, 0, 0) } public Remove_Base(id) { UnSet_BitVar(g_Had_Base, id) } public Event_CurWeapon(id) { static CSWID; CSWID = read_data(2) static SubModel; SubModel = SUBMODEL if((CSWID == CSW_BASE && g_OldWeapon[id] != CSW_BASE) && Get_BitVar(g_Had_Base, id)) { if(SubModel != -1) Draw_NewWeapon(id, CSWID) } else if((CSWID == CSW_BASE && g_OldWeapon[id] == CSW_BASE) && Get_BitVar(g_Had_Base, id)) { static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BASE) if(!pev_valid(Ent)) { g_OldWeapon[id] = get_user_weapon(id) return } set_pdata_float(Ent, 46, SPEED, 4) set_pdata_float(Ent, 47, SPEED, 4) } else if(CSWID != CSW_BASE && g_OldWeapon[id] == CSW_BASE) { if(SubModel != -1) Draw_NewWeapon(id, CSWID) } g_OldWeapon[id] = get_user_weapon(id) } public Draw_NewWeapon(id, CSW_ID) { if(CSW_ID == CSW_BASE) { static ent ent = fm_get_user_weapon_entity(id, CSW_BASE) if(pev_valid(ent) && Get_BitVar(g_Had_Base, id)) { set_pev(ent, pev_effects, pev(ent, pev_effects) &~ EF_NODRAW) engfunc(EngFunc_SetModel, ent, MODEL_P) set_pev(ent, pev_body, SUBMODEL) } } else { static ent ent = fm_get_user_weapon_entity(id, CSW_BASE) if(pev_valid(ent)) set_pev(ent, pev_effects, pev(ent, pev_effects) | EF_NODRAW) } } public fw_UpdateClientData_Post(id, sendweapons, cd_handle) { if(!is_alive(id)) return FMRES_IGNORED if(get_user_weapon(id) == CSW_BASE && Get_BitVar(g_Had_Base, id)) set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) return FMRES_HANDLED } public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2) { if (!is_connected(invoker)) return FMRES_IGNORED if(get_player_weapon(invoker) != CSW_BASE || !Get_BitVar(g_Had_Base, invoker)) return FMRES_IGNORED if(eventid != g_Event_Base) return FMRES_IGNORED engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2) DualAttack(invoker) return FMRES_SUPERCEDE } public DualAttack(id) { static iFlags, iAnimDesired, iWeaponState, iItem, szAnimation[64] #define WEAPONSTATE_ELITE_LEFT (1 << 3) iItem = fm_get_user_weapon_entity(id, CSW_BASE) if(!pev_valid(iItem)) return iFlags = pev(id, pev_flags); iWeaponState = get_pdata_int(iItem, 74, 4) if(iWeaponState & WEAPONSTATE_ELITE_LEFT) { iWeaponState &= ~ WEAPONSTATE_ELITE_LEFT; Set_WeaponAnim(id, ANIME_SHOOT_L1) Make_Shell(id, 1) formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot_%s" : "ref_shoot_%s", ANIM_EXT); } else { iWeaponState |= WEAPONSTATE_ELITE_LEFT; Set_WeaponAnim(id, ANIME_SHOOT_R1) Make_Shell(id, 0) formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot2_%s" : "ref_shoot2_%s", ANIM_EXT); } if((iAnimDesired = lookup_sequence(id, szAnimation)) == -1) iAnimDesired = 0; set_pev(id, pev_sequence, iAnimDesired) set_pdata_int(iItem, 74, iWeaponState, 4) emit_sound(id, CHAN_WEAPON, WeaponSounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15)) } public Make_Shell(id, Right) { static Float:player_origin[3], Float:origin[3], Float:origin2[3], Float:gunorigin[3], Float:oldangles[3], Float:v_forward[3], Float:v_forward2[3], Float:v_up[3], Float:v_up2[3], Float:v_right[3], Float:v_right2[3], Float:viewoffsets[3]; pev(id, pev_v_angle, oldangles); pev(id,pev_origin,player_origin); pev(id, pev_view_ofs, viewoffsets); engfunc(EngFunc_MakeVectors, oldangles) global_get(glb_v_forward, v_forward); global_get(glb_v_up, v_up); global_get(glb_v_right, v_right); global_get(glb_v_forward, v_forward2); global_get(glb_v_up, v_up2); global_get(glb_v_right, v_right2); xs_vec_add(player_origin, viewoffsets, gunorigin); if(!Right) { xs_vec_mul_scalar(v_forward, 10.3, v_forward); xs_vec_mul_scalar(v_right, 2.0, v_right); xs_vec_mul_scalar(v_up, -2.7, v_up); xs_vec_mul_scalar(v_forward2, 10.0, v_forward2); xs_vec_mul_scalar(v_right2, 4.0, v_right2); xs_vec_mul_scalar(v_up2, -3.0, v_up2); } else { xs_vec_mul_scalar(v_forward, 10.3, v_forward); xs_vec_mul_scalar(v_right, -4.0, v_right); xs_vec_mul_scalar(v_up, -3.7, v_up); xs_vec_mul_scalar(v_forward2, 10.0, v_forward2); xs_vec_mul_scalar(v_right2, 2.0, v_right2); xs_vec_mul_scalar(v_up2, -4.0, v_up2); } xs_vec_add(gunorigin, v_forward, origin); xs_vec_add(gunorigin, v_forward2, origin2); xs_vec_add(origin, v_right, origin); xs_vec_add(origin2, v_right2, origin2); xs_vec_add(origin, v_up, origin); xs_vec_add(origin2, v_up2, origin2); static Float:velocity[3] get_speed_vector(origin2, origin, random_float(140.0, 160.0), velocity) static angle; angle = random_num(0, 360) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_MODEL) engfunc(EngFunc_WriteCoord, origin[0]) engfunc(EngFunc_WriteCoord,origin[1]) engfunc(EngFunc_WriteCoord,origin[2]) engfunc(EngFunc_WriteCoord,velocity[0]) engfunc(EngFunc_WriteCoord,velocity[1]) engfunc(EngFunc_WriteCoord,velocity[2]) write_angle(angle) write_short(g_ShellId) write_byte(1) write_byte(20) message_end() } public fw_SetModel(entity, model[]) { if(!pev_valid(entity)) return FMRES_IGNORED static Classname[32] pev(entity, pev_classname, Classname, sizeof(Classname)) if(!equal(Classname, "weaponbox")) return FMRES_IGNORED static iOwner iOwner = pev(entity, pev_owner) if(equal(model, MODEL_W_OLD)) { static weapon; weapon = find_ent_by_owner(-1, weapon_base, entity) if(!pev_valid(weapon)) return FMRES_IGNORED; if(Get_BitVar(g_Had_Base, iOwner)) { set_pev(weapon, pev_impulse, WEAPON_CODE) engfunc(EngFunc_SetModel, entity, MODEL_W) set_pev(entity, pev_body, SUBMODEL) Remove_Base(iOwner) return FMRES_SUPERCEDE } } return FMRES_IGNORED; } public fw_CmdStart(id, uc_handle, seed) { if (!is_alive(id)) return FMRES_IGNORED if(get_player_weapon(id) != CSW_BASE || !Get_BitVar(g_Had_Base, id)) return FMRES_IGNORED static Button; Button = get_uc(uc_handle, UC_Buttons) if(Button & IN_ATTACK2) { static Float:Time; Time = get_pdata_float(id, 83, 5) if(Time > 0.0) return FMRES_IGNORED if(cs_get_user_zoom(id) != CS_SET_AUGSG552_ZOOM) cs_set_user_zoom(id, CS_SET_AUGSG552_ZOOM, 1) else cs_set_user_zoom(id, CS_RESET_ZOOM, 0) Time = 0.25 set_pdata_float(id, 83, Time, 5) } return FMRES_IGNORED } public fw_Item_Deploy_Post(Ent) { if(pev_valid(Ent) != 2) return static Id; Id = get_pdata_cbase(Ent, 41, 4) if(get_pdata_cbase(Id, 373) != Ent) return if(!Get_BitVar(g_Had_Base, Id)) return static SubModel; SubModel = SUBMODEL set_pev(Id, pev_viewmodel2, MODEL_V) set_pev(Id, pev_weaponmodel2, SubModel != -1 ? "" : MODEL_P) static Draw; Draw = ANIME_DRAW if(Draw != -1) Set_WeaponAnim(Id, ANIME_DRAW) set_pdata_string(Id, (492) * 4, ANIM_EXT, -1 , 20) } public fw_Item_AddToPlayer_Post(Ent, id) { if(!pev_valid(Ent)) return HAM_IGNORED if(pev(Ent, pev_impulse) == WEAPON_CODE) { Set_BitVar(g_Had_Base, id) set_pev(Ent, pev_impulse, 0) } return HAM_HANDLED } public fw_Item_PostFrame(ent) { static id; id = pev(ent, pev_owner) if(!is_user_alive(id)) return HAM_IGNORED if(!Get_BitVar(g_Had_Base, id)) return HAM_IGNORED static Float:flNextAttack; flNextAttack = get_pdata_float(id, 83, 5) static bpammo; bpammo = cs_get_user_bpammo(id, CSW_BASE) static iClip; iClip = get_pdata_int(ent, 51, 4) static fInReload; fInReload = get_pdata_int(ent, 54, 4) if(fInReload && flNextAttack <= 0.0) { static temp1 temp1 = min(CLIP - iClip, bpammo) set_pdata_int(ent, 51, iClip + temp1, 4) cs_set_user_bpammo(id, CSW_BASE, bpammo - temp1) set_pdata_int(ent, 54, 0, 4) fInReload = 0 } return HAM_IGNORED } public fw_Weapon_Reload(ent) { static id; id = pev(ent, pev_owner) if(!is_user_alive(id)) return HAM_IGNORED if(!Get_BitVar(g_Had_Base, id)) return HAM_IGNORED g_Clip[id] = -1 static BPAmmo; BPAmmo = cs_get_user_bpammo(id, CSW_BASE) static iClip; iClip = get_pdata_int(ent, 51, 4) if(BPAmmo <= 0) return HAM_SUPERCEDE if(iClip >= CLIP) return HAM_SUPERCEDE g_Clip[id] = iClip return HAM_HANDLED } public fw_Weapon_Reload_Post(ent) { static id; id = pev(ent, pev_owner) if(!is_user_alive(id)) return HAM_IGNORED if(!Get_BitVar(g_Had_Base, id)) return HAM_IGNORED if((get_pdata_int(ent, 54, 4) == 1)) { // Reload if(g_Clip[id] == -1) return HAM_IGNORED set_pdata_int(ent, 51, g_Clip[id], 4) static Reload; Reload = ANIME_RELOAD if(Reload != -1) Set_WeaponAnim(id, ANIME_RELOAD) Set_PlayerNextAttack(id, RELOAD_TIME) } return HAM_HANDLED } public fw_Weapon_WeaponIdle_Post( iEnt ) { if(pev_valid(iEnt) != 2) return static Id; Id = get_pdata_cbase(iEnt, 41, 4) if(get_pdata_cbase(Id, 373) != iEnt) return if(!Get_BitVar(g_Had_Base, Id)) return static Idle; Idle = ANIME_IDLE if(Idle != -1 && get_pdata_float(iEnt, 48, 4) <= 0.25) { Set_WeaponAnim(Id, ANIME_IDLE) set_pdata_float(iEnt, 48, 20.0, 4) } } public fw_TraceAttack_World(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits) { if(!is_connected(Attacker)) return HAM_IGNORED if(get_player_weapon(Attacker) != CSW_BASE || !Get_BitVar(g_Had_Base, Attacker)) return HAM_IGNORED static Float:flEnd[3], Float:vecPlane[3] get_tr2(Ptr, TR_vecEndPos, flEnd) get_tr2(Ptr, TR_vecPlaneNormal, vecPlane) Make_BulletHole(Attacker, flEnd, Damage) Make_BulletSmoke(Attacker, Ptr) SetHamParamFloat(3, float(DAMAGE)) return HAM_HANDLED } public fw_TraceAttack_Player(Victim, Attacker, Float:Damage, Float:Direction[3], Ptr, DamageBits) { if(!is_connected(Attacker)) return HAM_IGNORED if(get_player_weapon(Attacker) != CSW_BASE || !Get_BitVar(g_Had_Base, Attacker)) return HAM_IGNORED static Float:flEnd[3] get_tr2(Ptr, TR_vecEndPos, flEnd) SetHamParamFloat(3, float(DAMAGE)) return HAM_HANDLED } public fw_Weapon_PrimaryAttack(Ent) { static id; id = pev(Ent, pev_owner) if(!is_alive(id)) return if(!Get_BitVar(g_Had_Base, id)) return pev(id, pev_punchangle, g_Recoil[id]) } public fw_Weapon_PrimaryAttack_Post(Ent) { static id; id = pev(Ent, pev_owner) if(!is_alive(id)) return if(!Get_BitVar(g_Had_Base, id)) return static Float:Push[3] pev(id, pev_punchangle, Push) xs_vec_sub(Push, g_Recoil[id], Push) xs_vec_mul_scalar(Push, RECOIL, Push) xs_vec_add(Push, g_Recoil[id], Push) set_pev(id, pev_punchangle, Push) // Acc static Accena; Accena = ACCURACY if(Accena != -1) { static Float:Accuracy Accuracy = (float(100 - ACCURACY) * 1.5) / 100.0 set_pdata_float(Ent, 62, Accuracy, 4); } } /* =============================== ------------- SAFETY ------------- =================================*/ public Register_SafetyFunc() { register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1") RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1) RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1) } public Register_SafetyFuncBot(id) { RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1) RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1) } public Safety_Connected(id) { Set_BitVar(g_IsConnected, id) UnSet_BitVar(g_IsAlive, id) g_PlayerWeapon[id] = 0 } public Safety_Disconnected(id) { UnSet_BitVar(g_IsConnected, id) UnSet_BitVar(g_IsAlive, id) g_PlayerWeapon[id] = 0 } public Safety_CurWeapon(id) { if(!is_alive(id)) return static CSW; CSW = read_data(2) if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW } public fw_Safety_Spawn_Post(id) { if(!is_user_alive(id)) return Set_BitVar(g_IsAlive, id) } public fw_Safety_Killed_Post(id) { UnSet_BitVar(g_IsAlive, id) } public is_connected(id) { if(!(1 <= id <= 32)) return 0 if(!Get_BitVar(g_IsConnected, id)) return 0 return 1 } public is_alive(id) { if(!is_connected(id)) return 0 if(!Get_BitVar(g_IsAlive, id)) return 0 return 1 } public get_player_weapon(id) { if(!is_alive(id)) return 0 return g_PlayerWeapon[id] } /* =============================== --------- END OF SAFETY --------- =================================*/ stock Set_WeaponAnim(id, anim) { set_pev(id, pev_weaponanim, anim) message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id) write_byte(anim) write_byte(pev(id, pev_body)) message_end() } stock Make_BulletHole(id, Float:Origin[3], Float:Damage) { // Find target static Decal; Decal = random_num(41, 45) static LoopTime; if(Damage > 100.0) LoopTime = 2 else LoopTime = 1 for(new i = 0; i < LoopTime; i++) { // Put decal on "world" (a wall) message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_WORLDDECAL) engfunc(EngFunc_WriteCoord, Origin[0]) engfunc(EngFunc_WriteCoord, Origin[1]) engfunc(EngFunc_WriteCoord, Origin[2]) write_byte(Decal) message_end() // Show sparcles message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_GUNSHOTDECAL) engfunc(EngFunc_WriteCoord, Origin[0]) engfunc(EngFunc_WriteCoord, Origin[1]) engfunc(EngFunc_WriteCoord, Origin[2]) write_short(id) write_byte(Decal) message_end() } } stock Make_BulletSmoke(id, TrResult) { static Float:vecSrc[3], Float:vecEnd[3], TE_FLAG get_weapon_attachment(id, vecSrc) global_get(glb_v_forward, vecEnd) xs_vec_mul_scalar(vecEnd, 8192.0, vecEnd) xs_vec_add(vecSrc, vecEnd, vecEnd) get_tr2(TrResult, TR_vecEndPos, vecSrc) get_tr2(TrResult, TR_vecPlaneNormal, vecEnd) xs_vec_mul_scalar(vecEnd, 2.5, vecEnd) xs_vec_add(vecSrc, vecEnd, vecEnd) TE_FLAG |= TE_EXPLFLAG_NODLIGHTS TE_FLAG |= TE_EXPLFLAG_NOSOUND TE_FLAG |= TE_EXPLFLAG_NOPARTICLES engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0) write_byte(TE_EXPLOSION) engfunc(EngFunc_WriteCoord, vecEnd[0]) engfunc(EngFunc_WriteCoord, vecEnd[1]) engfunc(EngFunc_WriteCoord, vecEnd[2] - 10.0) write_short(g_SmokePuff_SprId) write_byte(2) write_byte(50) write_byte(TE_FLAG) message_end() } stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0) { static Float:vfEnd[3], viEnd[3] get_user_origin(id, viEnd, 3) IVecFVec(viEnd, vfEnd) static Float:fOrigin[3], Float:fAngle[3] pev(id, pev_origin, fOrigin) pev(id, pev_view_ofs, fAngle) xs_vec_add(fOrigin, fAngle, fOrigin) static Float:fAttack[3] xs_vec_sub(vfEnd, fOrigin, fAttack) xs_vec_sub(vfEnd, fOrigin, fAttack) static Float:fRate fRate = fDis / vector_length(fAttack) xs_vec_mul_scalar(fAttack, fRate, fAttack) xs_vec_add(fOrigin, fAttack, output) } stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[]) { new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3] pev(id, pev_origin, vOrigin) pev(id, pev_view_ofs,vUp) //for player xs_vec_add(vOrigin,vUp,vOrigin) pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight) angle_vector(vAngle,ANGLEVECTOR_UP,vUp) vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up } stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3]) { new_velocity[0] = origin2[0] - origin1[0] new_velocity[1] = origin2[1] - origin1[1] new_velocity[2] = origin2[2] - origin1[2] new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2])) new_velocity[0] *= num new_velocity[1] *= num new_velocity[2] *= num return 1; } stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle) { static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId) if(!pev_valid(entwpn)) return set_pdata_float(entwpn, 46, TimeIdle, 4) set_pdata_float(entwpn, 47, TimeIdle, 4) set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4) } stock Set_PlayerNextAttack(id, Float:nexttime) { set_pdata_float(id, 83, nexttime, 5) } stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[]) { static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3] pev(id, pev_origin, vOrigin) pev(id, pev_view_ofs,vUp) //for player xs_vec_add(vOrigin,vUp,vOrigin) pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight) angle_vector(vAngle,ANGLEVECTOR_UP,vUp) vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up } stock drop_weapons(id, dropwhat) { static weapons[32], num, i, weaponid num = 0 get_user_weapons(id, weapons, num) for (i = 0; i < num; i++) { weaponid = weapons[i] if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) { static wname[32] get_weaponname(weaponid, wname, sizeof wname - 1) engclient_cmd(id, "drop", wname) } } }
//
// C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_items_manager.sma(370) : warning 213: tag mismatch
// Header size: 2008 bytes
// Code size: 11552 bytes
// Data size: 8628 bytes
// Stack/heap size: 16384 bytes
// Total requirements: 38572 bytes
//
// 1 Warning.
// Done.
//
// Compilation Time: 0.69 sec
//// ze_give_escape_coins.sma
//
// C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_give_escape_coins.sma(21) : error 017: undefined symbol "iItemid"
// C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_give_escape_coins.sma(43) : error 017: undefined symbol "iItemid"
//
// 2 Errors.
// Could not locate output file compiled\ze_give_escape_coins.amx (compile failed).
//
// Compilation Time: 0.61 sec
// ----------------------------------------
Try now: viewtopic.php?p=8362#p8362
He who fails to plan is planning to fail
- //// ze_items_manager.sma
- //
- // C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_items_manager.sma(385) : warning 213: tag mismatch
- // Header size: 2044 bytes
- // Code size: 11748 bytes
- // Data size: 9172 bytes
- // Stack/heap size: 16384 bytes
- // Total requirements: 39348 bytes
- //
- // 1 Warning.
- // Done.
- //
- // Compilation Time: 0.67 sec
- // ----------------------------------------
- //// ze_items_escape_coins.sma
- //
- // C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_items_escape_coins.sma(24) : warning 213: tag mismatch
- // C:\Users\marcu\Desktop\Compiler v1.8.3\Compiler v1.8.3\scripting\ze_items_escape_coins.sma(46) : warning 213: tag mismatch
- // Header size: 824 bytes
- // Code size: 1844 bytes
- // Data size: 764 bytes
- // Stack/heap size: 16384 bytes
- // Total requirements: 19816 bytes
- //
- // 2 Warnings.
- // Done.
- //
- // Compilation Time: 0.64 sec
- // ----------------------------------------
He who fails to plan is planning to fail
Try with this and tell me what printed when you choose this item:
- #include <zombie_escape>
- #include <ze_vip>
- native ze_has_vip_discount(iItemid)
- native Float:ze_get_item_discount(iItemid)
- new g_iCurrentEC,
- g_iRequiredEC
- public plugin_init()
- {
- register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS)
- }
- public ze_select_item_pre(id, itemid, ignorecost)
- {
- if (ignorecost)
- return ZE_ITEM_AVAILABLE
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- if (g_iCurrentEC < g_iRequiredEC)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid, ignorecost)
- {
- if (ignorecost)
- return
- g_iCurrentEC = ze_get_escape_coins(id)
- client_print(0, print_chat, "%i", ze_has_vip_discount(itemid))
- client_print(0, print_chat, "%f", ze_get_item_discount(itemid))
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC)
- }
He who fails to plan is planning to fail
HereRaheem wrote: ↑5 years ago Try with this and tell me what printed when you choose this item:
#include <zombie_escape> #include <ze_vip> native ze_has_vip_discount(iItemid) native Float:ze_get_item_discount(iItemid) new g_iCurrentEC, g_iRequiredEC public plugin_init() { register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS) } public ze_select_item_pre(id, itemid, ignorecost) { if (ignorecost) return ZE_ITEM_AVAILABLE g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id) && ze_has_vip_discount(itemid)) { g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } if (g_iCurrentEC < g_iRequiredEC) return ZE_ITEM_UNAVAILABLE return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid, ignorecost) { if (ignorecost) return g_iCurrentEC = ze_get_escape_coins(id) client_print(0, print_chat, "%i", ze_has_vip_discount(itemid)) client_print(0, print_chat, "%f", ze_get_item_discount(itemid)) if (ze_is_user_vip(id) && ze_has_vip_discount(itemid)) { g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC) }
Let's finish it... Try with text ADDED:
- #include <zombie_escape>
- #include <ze_vip>
- native ze_has_vip_discount(iItemid)
- native Float:ze_get_item_discount(iItemid)
- new g_iCurrentEC,
- g_iRequiredEC
- public plugin_init()
- {
- register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS)
- }
- public ze_select_item_pre(id, itemid, ignorecost)
- {
- if (ignorecost)
- return ZE_ITEM_AVAILABLE
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount
- new szText[32]
- formatex(szText, charsmax(szText), " \w(\r%i %% OFF\w)", floatround(ze_get_item_discount(itemid) * 100))
- ze_add_text_to_item(szText)
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- if (g_iCurrentEC < g_iRequiredEC)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid, ignorecost)
- {
- if (ignorecost)
- return
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC)
- }
He who fails to plan is planning to fail
Yep works!Raheem wrote: ↑5 years ago Let's finish it... Try with text ADDED:
#include <zombie_escape> #include <ze_vip> native ze_has_vip_discount(iItemid) native Float:ze_get_item_discount(iItemid) new g_iCurrentEC, g_iRequiredEC public plugin_init() { register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS) } public ze_select_item_pre(id, itemid, ignorecost) { if (ignorecost) return ZE_ITEM_AVAILABLE g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id) && ze_has_vip_discount(itemid)) { g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount new szText[32] formatex(szText, charsmax(szText), " \w(\r%i %% OFF\w)", floatround(ze_get_item_discount(itemid) * 100)) ze_add_text_to_item(szText) } else { g_iRequiredEC = ze_get_item_cost(itemid) } if (g_iCurrentEC < g_iRequiredEC) return ZE_ITEM_UNAVAILABLE return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid, ignorecost) { if (ignorecost) return g_iCurrentEC = ze_get_escape_coins(id) if (ze_is_user_vip(id) && ze_has_vip_discount(itemid)) { g_iRequiredEC = floatround(ze_get_item_cost(itemid) * ze_get_item_discount(itemid)) // 50 % discount } else { g_iRequiredEC = ze_get_item_cost(itemid) } ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC) }
Can you post a pic for the text?
He who fails to plan is planning to fail
So if anyone need to add discount for VIPs on any item he should follow the following:
1. Update your ze_items_manager.sma with:
Important: You must run latest VIP System in order this to run!
1. Update your ze_items_manager.sma with:
- #include <zombie_escape>
- // Setting File
- new const ZE_EXTRAITEM_FILE[] = "ze_extraitems.ini"
- // Defines
- #define MENU_PAGE_ITEMS g_iMenuData[id]
- // Const
- const OFFSET_CSMENUCODE = 205
- // Forwards
- enum _:TOTAL_FORWARDS
- {
- FW_ITEM_SELECT_PRE = 0,
- FW_ITEM_SELECT_POST
- }
- new g_iForwards[TOTAL_FORWARDS],
- g_iForwardReturn
- // Variables
- new Array:g_szItemRealName,
- Array:g_szItemName,
- Array:g_iItemCost,
- Array:g_iItemLimit
- new g_iItemCount,
- g_szAdditionalMenuText[32],
- g_iMenuData[33],
- bool:g_bHasDiscount[MAX_EXTRA_ITEMS],
- Float:g_flDiscountValue[MAX_EXTRA_ITEMS]
- public plugin_init()
- {
- register_plugin("[ZE] Items Manager", ZE_VERSION, AUTHORS)
- // Commands
- register_clcmd("say /items", "Cmd_Items")
- // Forwards (In Pre Return Values important)
- g_iForwards[FW_ITEM_SELECT_PRE] = CreateMultiForward("ze_select_item_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL)
- g_iForwards[FW_ITEM_SELECT_POST] = CreateMultiForward("ze_select_item_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
- }
- public plugin_natives()
- {
- register_native("ze_register_item", "native_ze_register_item")
- register_native("ze_show_items_menu", "native_ze_show_items_menu")
- register_native("ze_force_buy_item", "native_ze_force_buy_item")
- register_native("ze_get_item_id", "native_ze_get_item_id")
- register_native("ze_get_item_cost", "native_ze_get_item_cost")
- register_native("ze_add_text_to_item", "native_ze_add_text_to_item")
- register_native("ze_get_item_limit", "native_ze_get_item_limit")
- register_native("ze_is_valid_itemid", "native_ze_is_valid_itemid")
- register_native("ze_get_item_name", "native_ze_get_item_name")
- register_native("ze_set_vip_discount", "native_ze_set_vip_discount", 1)
- register_native("ze_has_vip_discount", "native_ze_has_vip_discount", 1)
- register_native("ze_has_vip_discount", "native_ze_has_vip_discount", 1)
- register_native("ze_get_item_discount", "native_ze_get_item_discount", 1)
- g_szItemRealName = ArrayCreate(32, 1)
- g_szItemName = ArrayCreate(32, 1)
- g_iItemCost = ArrayCreate(1, 1)
- g_iItemLimit = ArrayCreate(1, 1)
- }
- public client_disconnected(id)
- {
- MENU_PAGE_ITEMS = 0
- }
- public Cmd_Items(id)
- {
- if (!is_user_alive(id))
- return
- Show_Items_Menu(id)
- }
- // Items Menu
- Show_Items_Menu(id)
- {
- static menu[128], name[32], cost, transkey[64]
- new menuid, index, itemdata[2]
- // Title
- formatex(menu, charsmax(menu), "%L:\r", id, "BUY_EXTRAITEM")
- menuid = menu_create(menu, "Extra_Items_Menu")
- // Item List
- for (index = 0; index < g_iItemCount; index++)
- {
- // Additional text to display
- g_szAdditionalMenuText[0] = 0
- // Execute item select attempt forward
- ExecuteForward(g_iForwards[FW_ITEM_SELECT_PRE], g_iForwardReturn, id, index, 0)
- // Show item to player?
- if (g_iForwardReturn >= ZE_ITEM_DONT_SHOW)
- continue;
- // Add Item Name and Cost
- ArrayGetString(g_szItemName, index, name, charsmax(name))
- cost = ArrayGetCell(g_iItemCost, index)
- // ML support for item name
- formatex(transkey, charsmax(transkey), "ITEMNAME %s", name)
- if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
- // Item available to player?
- if (g_iForwardReturn >= ZE_ITEM_UNAVAILABLE)
- formatex(menu, charsmax(menu), "\d%s %d %s", name, cost, g_szAdditionalMenuText)
- else
- formatex(menu, charsmax(menu), "%s \y%d \w%s", name, cost, g_szAdditionalMenuText)
- itemdata[0] = index
- itemdata[1] = 0
- menu_additem(menuid, menu, itemdata)
- }
- // No items to display?
- if (menu_items(menuid) <= 0)
- {
- ze_colored_print(id, "%L", id, "NO_EXTRA_ITEMS")
- menu_destroy(menuid)
- return;
- }
- // Back - Next - Exit
- formatex(menu, charsmax(menu), "%L", id, "BACK")
- menu_setprop(menuid, MPROP_BACKNAME, menu)
- formatex(menu, charsmax(menu), "%L", id, "NEXT")
- menu_setprop(menuid, MPROP_NEXTNAME, menu)
- formatex(menu, charsmax(menu), "%L", id, "EXIT")
- menu_setprop(menuid, MPROP_EXITNAME, menu)
- // If remembered page is greater than number of pages, clamp down the value
- MENU_PAGE_ITEMS = min(MENU_PAGE_ITEMS, menu_pages(menuid)-1)
- // Fix for AMXX custom menus
- set_pdata_int(id, OFFSET_CSMENUCODE, 0)
- menu_display(id, menuid, MENU_PAGE_ITEMS)
- }
- // Items Menu
- public Extra_Items_Menu(id, menuid, item)
- {
- // Menu was closed
- if (item == MENU_EXIT)
- {
- MENU_PAGE_ITEMS = 0
- menu_destroy(menuid)
- return PLUGIN_HANDLED;
- }
- // Remember items menu page
- MENU_PAGE_ITEMS = item / 7
- // Dead players are not allowed to buy items
- if (!is_user_alive(id))
- {
- menu_destroy(menuid)
- return PLUGIN_HANDLED;
- }
- // Retrieve item id
- new itemdata[2], dummy, itemid
- menu_item_getinfo(menuid, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
- itemid = itemdata[0]
- // Attempt to buy the item
- Buy_Item(id, itemid)
- menu_destroy(menuid)
- return PLUGIN_HANDLED;
- }
- // Buy Item
- Buy_Item(id, itemid, ignorecost = 0)
- {
- // Execute item select attempt forward
- ExecuteForward(g_iForwards[FW_ITEM_SELECT_PRE], g_iForwardReturn, id, itemid, ignorecost)
- // Item available to player?
- if (g_iForwardReturn >= ZE_ITEM_UNAVAILABLE)
- return;
- // Execute item selected forward
- ExecuteForward(g_iForwards[FW_ITEM_SELECT_POST], g_iForwardReturn, id, itemid, ignorecost)
- }
- // Natives
- public native_ze_register_item(plugin_id, num_params)
- {
- new szItem_Name[32], iItem_Cost, iItem_Limit
- // Get the Data from first Parameter in the native (Item Name)
- get_string(1, szItem_Name, charsmax(szItem_Name))
- // Get the Second Parameter (Item Cost)
- iItem_Cost = get_param(2)
- // Get limit third parameter
- iItem_Limit = get_param(3)
- if (strlen(szItem_Name) < 1)
- {
- // Can't leave item name empty
- log_error(AMX_ERR_NATIVE, "[ZE] Can't register item with an empty name")
- return ZE_WRONG_ITEM // Same as return -1
- }
- new iIndex, szItemName[32]
- // Loop from 0 to max items amount
- for (iIndex = 0; iIndex < g_iItemCount; iIndex++)
- {
- ArrayGetString(g_szItemRealName, iIndex, szItemName, charsmax(szItemName))
- if (equali(szItem_Name, szItemName))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Item already registered (%s)", szItemName)
- return ZE_WRONG_ITEM; // Return -1
- }
- }
- // Load settings from extra items file
- new szItemRealName[32]
- copy(szItemRealName, charsmax(szItemRealName), szItem_Name)
- ArrayPushString(g_szItemRealName, szItemRealName)
- // Name
- if (!amx_load_setting_string(ZE_EXTRAITEM_FILE, szItemRealName, "NAME", szItem_Name, charsmax(szItem_Name)))
- amx_save_setting_string(ZE_EXTRAITEM_FILE, szItemRealName, "NAME", szItem_Name)
- ArrayPushString(g_szItemName, szItem_Name)
- // Cost
- if (!amx_load_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "COST", iItem_Cost))
- amx_save_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "COST", iItem_Cost)
- ArrayPushCell(g_iItemCost, iItem_Cost)
- // Limit
- if (!amx_load_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "LIMIT", iItem_Limit))
- amx_save_setting_int(ZE_EXTRAITEM_FILE, szItemRealName, "LIMIT", iItem_Limit)
- ArrayPushCell(g_iItemLimit, iItem_Limit)
- g_iItemCount++
- return g_iItemCount - 1
- }
- public native_ze_show_items_menu(plugin_id, num_params)
- {
- new id = get_param(1)
- if (!is_user_connected(id))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
- return false;
- }
- Cmd_Items(id)
- return true
- }
- public native_ze_force_buy_item(plugin_id, num_params)
- {
- new id = get_param(1)
- if (!is_user_connected(id))
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
- return false;
- }
- new item_id = get_param(2)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return false;
- }
- new ignorecost = get_param(3)
- Buy_Item(id, item_id, ignorecost)
- return true;
- }
- public native_ze_get_item_id(plugin_id, num_params)
- {
- new szRealName[32]
- get_string(1, szRealName, charsmax(szRealName))
- new index, szItemName[32]
- for (index = 0; index < g_iItemCount; index++)
- {
- ArrayGetString(g_szItemRealName, index, szItemName, charsmax(szItemName))
- if (equali(szRealName, szItemName))
- return index
- }
- return ZE_WRONG_ITEM
- }
- public native_ze_get_item_cost(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return ZE_WRONG_ITEM;
- }
- return ArrayGetCell(g_iItemCost, item_id);
- }
- public native_ze_add_text_to_item(plugin_id, num_params)
- {
- new szText[32]
- get_string(1, szText, charsmax(szText))
- format(g_szAdditionalMenuText, charsmax(g_szAdditionalMenuText), "%s%s", g_szAdditionalMenuText, szText)
- }
- public native_ze_get_item_limit(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return ZE_WRONG_ITEM;
- }
- return ArrayGetCell(g_iItemLimit, item_id);
- }
- public native_ze_is_valid_itemid(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- return false;
- }
- return true;
- }
- public native_ze_get_item_name(plugin_id, num_params)
- {
- new item_id = get_param(1)
- if (item_id < 0 || item_id >= g_iItemCount)
- {
- log_error(AMX_ERR_NATIVE, "[ZE] Invalid item id (%d)", item_id)
- return ZE_WRONG_ITEM;
- }
- new szName[32]
- ArrayGetString(g_szItemName, item_id, szName, charsmax(szName))
- new iLen = get_param(3)
- set_string(2, szName, iLen)
- return true;
- }
- public native_ze_set_vip_discount(iItemid, bool:bSet, Float:flDiscount)
- {
- g_bHasDiscount[iItemid] = bSet;
- g_flDiscountValue[iItemid] = flDiscount;
- }
- public native_ze_has_vip_discount(iItemid)
- {
- return g_bHasDiscount[iItemid]
- }
- public Float:native_ze_get_item_discount(iItemid)
- {
- return g_flDiscountValue[iItemid]
- }
- #include <zombie_escape>
- #include <ze_vip>
- native ze_has_vip_discount(iItemid)
- native Float:ze_get_item_discount(iItemid)
- new g_iCurrentEC,
- g_iRequiredEC
- public plugin_init()
- {
- register_plugin("[ZE] Items Manager: Escape Coins", ZE_VERSION, AUTHORS)
- }
- public ze_select_item_pre(id, itemid, ignorecost)
- {
- if (ignorecost)
- return ZE_ITEM_AVAILABLE
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * (1.0 - ze_get_item_discount(itemid)))
- new szText[32]
- formatex(szText, charsmax(szText), " \w(\r%i %% OFF\w)", floatround(ze_get_item_discount(itemid) * 100))
- ze_add_text_to_item(szText)
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- if (g_iCurrentEC < g_iRequiredEC)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid, ignorecost)
- {
- if (ignorecost)
- return
- g_iCurrentEC = ze_get_escape_coins(id)
- if (ze_is_user_vip(id) && ze_has_vip_discount(itemid))
- {
- g_iRequiredEC = floatround(ze_get_item_cost(itemid) * (1.0 - ze_get_item_discount(itemid)))
- }
- else
- {
- g_iRequiredEC = ze_get_item_cost(itemid)
- }
- ze_set_escape_coins(id, g_iCurrentEC - g_iRequiredEC)
- }
- native ze_set_vip_discount(iItemid, bool:bSet, Float:flDiscount);
- iItemid - Item id returned from ze_register_item() native.
- bSet - set discount to this item or not. Make it true.
- flDiscount - from 0 to 1, to make discount 10% use 0.1 to make 80 % use 0.8 and so on.
- #include <zombie_escape>
- native ze_set_vip_discount(iItemid, bool:bSet, Float:flDiscount);
- // Default Sound
- new const g_szBuyAmmoSound[] = "items/9mmclip1.wav"
- // Variables
- new g_iItemID
- public plugin_init()
- {
- register_plugin("[ZE] Items: Fire Nade", ZE_VERSION, AUTHORS)
- // Register our item
- g_iItemID = ze_register_item("Fire Nade", 30, 0)
- ze_set_vip_discount(g_iItemID, true, 0.4)
- }
- public ze_select_item_pre(id, itemid)
- {
- // Return Available and we will block it in Post, So it dosen't affect other plugins
- if (itemid != g_iItemID)
- return ZE_ITEM_AVAILABLE
- // Available for Humans only, So don't show it for zombies
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- // This is not our item, Block it here
- if (itemid != g_iItemID)
- return
- // Get Weapon ID
- new iWpnID = get_weaponid("weapon_hegrenade")
- // Player Don't have Frost Grenade then give him
- if (rg_get_user_bpammo(id, WeaponIdType:iWpnID) == 0)
- {
- rg_give_item(id, "weapon_hegrenade", GT_APPEND)
- }
- else
- {
- // Player have, Increase his Back Pack Ammo, And play buy BP sound + Hud Flash
- rg_set_user_bpammo(id, WeaponIdType:iWpnID, rg_get_user_bpammo(id, WeaponIdType:iWpnID) + 1)
- emit_sound(id, CHAN_ITEM, g_szBuyAmmoSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
- Show_Given_BPAmmo(id, 12, 1) // HE Grenade AmmoType Const = 12
- }
- }
ze_set_vip_discount(g_iItemID, true, 0.4)
under g_iItemID = ze_register_item("Fire Nade", 30, 0)
.Important: You must run latest VIP System in order this to run!
He who fails to plan is planning to fail
Create an account or sign in to join the discussion
You need to be a member in order to post a reply
Create an account
Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute
Sign in
Who is online
Users browsing this forum: No registered users and 2 guests