· 7 years ago · Nov 30, 2018, 10:32 PM
1#include <amxmodx>
2#include <cstrike>
3#include <fakemeta>
4#include <engine>
5#include <hamsandwich>
6#include <fun>
7#include <xs>
8#include <csx>
9#include <sqlx>
10#include <cod>
11
12#define PLUGIN "CoD Mod"
13#define VERSION "1.1.0"
14#define AUTHOR "O'Zone"
15
16#pragma dynamic 65536
17
18#define TASK_SHOW_INFO 3357
19#define TASK_SHOW_AD 4268
20#define TASK_SHOW_HELP 5456
21#define TASK_SPEED_LIMIT 6144
22#define TASK_SET_SPEED 7532
23#define TASK_END_KILL_STREAK 8779
24#define TASK_RENDER 9611
25#define TASK_GLOW 10932
26#define TASK_DAMAGE 11342
27#define TASK_BLOCK 12731
28#define TASK_BLOCK_INFO 13935
29#define TASK_RESPAWN 14294
30
31#define LOG_FILE "cod_mod.log"
32
33new const commandClass[][] = { "klasa", "say /klasa", "say_team /klasa", "say /class", "say_team /class", "say /k", "say_team /k", "say /c", "say_team /c" };
34new const commandClasses[][] = { "klasy", "say /klasy", "say_team /klasy", "say /classes", "say_team /classes", "say /ky", "say_team /ky", "say /cs", "say_team /cs" };
35new const commandItem[][] = { "item", "say /item", "say_team /item", "say /przedmiot", "say_team /przedmiot", "say /perk", "say_team /perk", "say /i", "say_team /i", "say /p", "say_team /p" };
36new const commandItems[][] = { "itemy", "say /itemy", "say_team /itemy", "say /items", "say_team /items", "say /przedmioty", "say_team /przedmioty", "say /perks", "say_team /perks", "say /perki", "say_team /perki", "say /perks", "say_team /perks", "say /iy", "say_team /iy", "say /py", "say_team /py" };
37new const commandDrop[][] = { "wyrzuc", "say /wyrzuc", "say_team /wyrzuc", "say /drop", "say_team /drop", "say /w", "say_team /w", "say /d", "say_team /d" };
38new const commandReset[][] = { "resetuj", "say /resetuj", "say_team /resetuj", "say /r", "say_team /r" };
39new const commandPoints[][] = { "punkty", "say /statystyki", "say_team /statystyki", "say /punkty", "say_team /punkty", "say /s", "say_team /s", "say /p", "say_team /p" };
40new const commandHud[][] = { "hud", "say /hud", "say_team /hud", "say /zmienhud", "say_team /zmienhud", "say /change_hud", "say_team /change_hud" };
41new const commandTop[][] = { "top", "say /toplvl", "say_team /toplvl", "say /toplevel", "say_team /toplevel", "say /toppoziom", "say_team /toppoziom", "say /ltop15", "say_team /ltop15", "say /ptop15", "say_team /ptop15" };
42new const commandBlock[][] = { "fullupdate", "cl_autobuy", "cl_rebuy", "cl_setautobuy", "rebuy", "autobuy", "hegren", "sgren", "flash", "-rocket", "-mine", "-dynamite", "-medkit", "-teleport", "-class", "-item" };
43
44new const weapons[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
45 "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550", "weapon_galil",
46 "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249", "weapon_m3", "weapon_m4a1",
47 "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90" };
48
49new const maxClipAmmo[] = { -1, 13, -1, 10, 1, 7, 1, 30, 30, 1, 30, 20, 25, 30, 35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50 };
50new const maxBpAmmo[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120, 30, 120, 200, 32, 90, 120, 90, 1, 35, 90, 90, -1, 100 }
51
52new const pointsDistribution[] = { 1, 3, 5, 10, 25, FULL };
53
54enum _:models { MODEL_ROCKET, MODEL_MINE, MODEL_DYNAMITE, MODEL_MEDKIT };
55
56new const codModels[models][] = {
57 "models/CoDMod/rocket.mdl",
58 "models/CoDMod/mine.mdl",
59 "models/CoDMod/dynamite.mdl",
60 "models/CoDMod/medkit.mdl"
61};
62
63enum _:sprites { SPRITE_EXPLOSION, SPRITE_WHITE, SPRITE_THUNDER, SPRITE_FIRE, SPRITE_SMOKE };
64
65new const codSprites[sprites][] = {
66 "sprites/dexplo.spr",
67 "sprites/white.spr",
68 "sprites/lgtning.spr",
69 "sprites/fire.spr",
70 "sprites/steam1.spr",
71};
72
73new codSprite[sizeof codSprites];
74
75new allowedWeapons = 1<<CSW_KNIFE | 1<<CSW_C4;
76
77enum _:save { NORMAL, FINAL, MAP_END };
78
79enum _:repeatingData { ATTACKER, VICTIM, DAMAGE, COUNTER, FLAGS };
80
81enum _:weaponSlots { PRIMARY = 1, SECONDARY, KNIFE, GRENADES, C4 };
82
83enum _:forwards { CLASS_CHANGED, ITEM_CHANGED, RENDER_CHANGED, GRAVITY_CHANGED, SPEED_CHANGED, DAMAGE_PRE, DAMAGE_POST, WEAPON_DEPLOY, CUR_WEAPON, KILLED, SPAWNED,
84 CMD_START, PRETHINK, NEW_ROUND, START_ROUND, END_ROUND, END_MAP, MEDKIT_HEAL, ROCKET_EXPLODE, MINE_EXPLODE, DYNAMITE_EXPLODE, THUNDER_REACH, TELEPORT_USED };
85
86enum _:itemInfo { ITEM_NAME[MAX_NAME], ITEM_DESC[MAX_DESC], ITEM_PLUGIN, ITEM_RANDOM_MIN, ITEM_RANDOM_MAX, ITEM_GIVE, ITEM_DROP,
87 ITEM_SPAWNED, ITEM_KILL, ITEM_KILLED, ITEM_SKILL_USED, ITEM_UPGRADE, ITEM_VALUE, ITEM_DAMAGE_ATTACKER, ITEM_DAMAGE_VICTIM };
88
89enum _:classInfo { CLASS_NAME[MAX_NAME], CLASS_DESC[MAX_DESC], CLASS_FRACTION[MAX_NAME], CLASS_HEAL, CLASS_INT, CLASS_STR,
90 CLASS_COND, CLASS_STAM, CLASS_WEAPONS, CLASS_PROMOTION, CLASS_DEGREE, CLASS_LEVEL, CLASS_FLAG, CLASS_PLUGIN, CLASS_ENABLED,
91 CLASS_DISABLED, CLASS_SPAWNED, CLASS_KILL, CLASS_KILLED, CLASS_SKILL_USED, CLASS_DAMAGE_VICTIM, CLASS_DAMAGE_ATTACKER };
92
93enum _:playerClassInfo { PCLASS_LEVEL, PCLASS_EXP, PCLASS_HEAL, PCLASS_INT, PCLASS_STAM, PCLASS_STR, PCLASS_COND, PCLASS_POINTS };
94
95enum _:renderInfo { RENDER_TYPE, RENDER_VALUE, RENDER_STATUS, RENDER_WEAPON };
96
97enum _:playerInfo { PLAYER_CLASS, PLAYER_NEW_CLASS, PLAYER_PROMOTION_ID, PLAYER_PROMOTION, PLAYER_LEVEL, PLAYER_GAINED_LEVEL, PLAYER_EXP, PLAYER_GAINED_EXP, PLAYER_HEAL, PLAYER_INT,
98 PLAYER_STAM, PLAYER_STR, PLAYER_COND, PLAYER_POINTS, PLAYER_POINTS_SPEED, PLAYER_EXTRA_HEAL, PLAYER_EXTRA_INT, PLAYER_EXTRA_STAM, PLAYER_EXTRA_STR, PLAYER_EXTRA_COND, PLAYER_EXTRA_WEAPONS,
99 PLAYER_WEAPON, PLAYER_WEAPONS, PLAYER_STATUS, PLAYER_ITEM, PLAYER_ITEM_DURA, PLAYER_DYNAMITE, PLAYER_LEFT_JUMPS, PLAYER_SPAWNED, PLAYER_KS, PLAYER_TIME_KS, Float:PLAYER_LAST_ROCKET, Float:PLAYER_LAST_MINE,
100 Float:PLAYER_LAST_DYNAMITE, Float:PLAYER_LAST_MEDKIT, Float:PLAYER_LAST_THUNDER, Float:PLAYER_LAST_TELEPORT, PLAYER_HUD_RED, PLAYER_HUD_GREEN, PLAYER_HUD_BLUE, PLAYER_HUD_POSX, PLAYER_HUD_POSY,
101 PLAYER_ROCKETS[ALL + 1], PLAYER_MINES[ALL + 1], PLAYER_DYNAMITES[ALL + 1], PLAYER_MEDKITS[ALL + 1], PLAYER_THUNDERS[ALL + 1], PLAYER_TELEPORTS[ALL + 1], PLAYER_JUMPS[ALL + 1], PLAYER_BUNNYHOP[ALL + 1],
102 PLAYER_FOOTSTEPS[ALL + 1], PLAYER_MODEL[ALL + 1], PLAYER_RESISTANCE[ALL + 1], PLAYER_GODMODE[ALL + 1], PLAYER_NOCLIP[ALL + 1], PLAYER_UNLIMITED_AMMO[ALL + 1], PLAYER_UNLIMITED_AMMO_WEAPONS[ALL + 1],
103 PLAYER_ELIMINATOR[ALL + 1], PLAYER_ELIMINATOR_WEAPONS[ALL + 1], PLAYER_REDUCER[ALL + 1], PLAYER_REDUCER_WEAPONS[ALL + 1], Float:PLAYER_GRAVITY[ALL + 1], Float:PLAYER_SPEED[ALL + 1], PLAYER_NAME[MAX_SAFE_NAME] };
104
105new codPlayer[MAX_PLAYERS + 1][playerInfo];
106
107new cvarExpKill, cvarExpKillHS, cvarExpDamage, cvarExpDamagePer, cvarExpWinRound, cvarExpPlant, cvarExpDefuse, cvarExpRescue, cvarNightExpEnabled, cvarNightExpFrom, cvarNightExpTo,
108 cvarLevelLimit, cvarLevelRatio, cvarKillStreakTime, cvarMinPlayers, cvarMinBonusPlayers, cvarMaxDurability, cvarMinDamageDurability, cvarMaxDamageDurability, Float:cvarBlockSkillsTime;
109
110new Array:codItems, Array:codClasses, Array:codPromotions, Array:codFractions, Array:codPlayerClasses[MAX_PLAYERS + 1], Array:codPlayerRender[MAX_PLAYERS + 1], codForwards[forwards];
111
112new Handle:sql, Handle:connection, bool:sqlConnected, bool:freezeTime, bool:skillsBlocked, bool:nightExp, bool:mapChange, hudInfo,
113 hudSync, hudSync2, playersNum, dataLoaded, hudLoaded, resetStats, userConnected, renderTimer, glowActive, roundStart, lastInfo;
114
115public plugin_init()
116{
117 register_plugin(PLUGIN, VERSION, AUTHOR);
118
119 create_arrays();
120
121 create_cvar("cod_sql_host", "sql.pukawka.pl", FCVAR_SPONLY | FCVAR_PROTECTED);
122 create_cvar("cod_sql_user", "666263", FCVAR_SPONLY | FCVAR_PROTECTED);
123 create_cvar("cod_sql_pass", "3CK1CfKXSPjFMK0", FCVAR_SPONLY | FCVAR_PROTECTED);
124 create_cvar("cod_sql_db", "666263_cod", FCVAR_SPONLY | FCVAR_PROTECTED);
125
126 bind_pcvar_num(create_cvar("cod_kill_exp", "30"), cvarExpKill);
127 bind_pcvar_num(create_cvar("cod_hs_exp", "10"), cvarExpKillHS);
128 bind_pcvar_num(create_cvar("cod_damage_exp", "3"), cvarExpDamage);
129 bind_pcvar_num(create_cvar("cod_damage_exp_per", "25"), cvarExpDamagePer);
130 bind_pcvar_num(create_cvar("cod_win_exp", "25"), cvarExpWinRound);
131 bind_pcvar_num(create_cvar("cod_bomb_exp", "25"), cvarExpPlant);
132 bind_pcvar_num(create_cvar("cod_defuse_exp", "25"), cvarExpDefuse);
133 bind_pcvar_num(create_cvar("cod_host_exp", "25"), cvarExpRescue);
134 bind_pcvar_num(create_cvar("cod_night_exp", "1"), cvarNightExpEnabled);
135 bind_pcvar_num(create_cvar("cod_night_exp_from", "22"), cvarNightExpFrom);
136 bind_pcvar_num(create_cvar("cod_night_exp_to", "8"), cvarNightExpTo);
137 bind_pcvar_num(create_cvar("cod_max_level", "501"), cvarLevelLimit);
138 bind_pcvar_num(create_cvar("cod_level_ratio", "20"), cvarLevelRatio);
139 bind_pcvar_num(create_cvar("cod_killstreak_time", "15"), cvarKillStreakTime);
140 bind_pcvar_num(create_cvar("cod_min_players", "4"), cvarMinPlayers);
141 bind_pcvar_num(create_cvar("cod_min_bonus_players", "10"), cvarMinBonusPlayers);
142 bind_pcvar_num(create_cvar("cod_max_durability", "100"), cvarMaxDurability);
143 bind_pcvar_num(create_cvar("cod_min_damage_durability", "10"), cvarMinDamageDurability);
144 bind_pcvar_num(create_cvar("cod_max_damage_durability", "25"), cvarMaxDamageDurability);
145 bind_pcvar_float(create_cvar("cod_block_skills_time", "5"), cvarBlockSkillsTime);
146
147 register_cvar("cod_version", VERSION, FCVAR_SERVER);
148
149 for (new i; i < sizeof commandClass; i++) register_clcmd(commandClass[i], "select_fraction");
150 for (new i; i < sizeof commandClasses; i++) register_clcmd(commandClasses[i], "display_classes_description");
151 for (new i; i < sizeof commandItem; i++) register_clcmd(commandItem[i], "display_item_description");
152 for (new i; i < sizeof commandItems; i++) register_clcmd(commandItems[i], "display_items_description");
153 for (new i; i < sizeof commandDrop; i++) register_clcmd(commandDrop[i], "drop_item");
154 for (new i; i < sizeof commandReset; i++) register_clcmd(commandReset[i], "reset_stats");
155 for (new i; i < sizeof commandPoints; i++) register_clcmd(commandPoints[i], "assign_points");
156 for (new i; i < sizeof commandHud; i++) register_clcmd(commandHud[i], "change_hud");
157 for (new i; i < sizeof commandBinds; i++) register_clcmd(commandBinds[i], "show_binds");
158 for (new i; i < sizeof commandTop; i++) register_clcmd(commandTop[i], "level_top");
159 for (new i; i < sizeof commandBlock; i++) register_clcmd(commandBlock[i], "block_command");
160
161 register_clcmd("+rocket", "use_rocket");
162 register_clcmd("+mine", "use_mine");
163 register_clcmd("+dynamite", "use_dynamite");
164 register_clcmd("+medkit", "use_medkit");
165 register_clcmd("+thunder", "use_thunder");
166 register_clcmd("+teleport", "use_teleport");
167 register_clcmd("+class", "use_class");
168 register_clcmd("+item", "use_item");
169
170 register_impulse(100, "use_item");
171
172 register_touch("rocket", "*" , "touch_rocket");
173 register_touch("mine", "player" , "touch_mine");
174 register_think("medkit", "think_medkit");
175
176 RegisterHam(Ham_Spawn, "player", "player_spawn", 1);
177 RegisterHam(Ham_TakeDamage, "player", "player_take_damage_pre", 0);
178 RegisterHam(Ham_TakeDamage, "player", "player_take_damage_post", 1);
179 RegisterHam(Ham_Touch, "armoury_entity", "touch_weapon");
180 RegisterHam(Ham_Touch, "weapon_shield", "touch_weapon");
181 RegisterHam(Ham_Touch, "weaponbox", "touch_weapon");
182 RegisterHam(Ham_CS_Player_ResetMaxSpeed, "player", "speed_change", 1);
183 RegisterHam(Ham_Spawn, "func_buyzone", "block_buyzone");
184
185 for (new i = 1; i < sizeof weapons; i++) {
186 if (weapons[i][0]) RegisterHam(Ham_Item_Deploy, weapons[i], "weapon_deploy_post", 1);
187 }
188
189 register_logevent("round_start", 2, "1=Round_Start");
190 register_logevent("round_end", 2, "1=Round_End");
191
192 register_event("HLTV", "new_round", "a", "1=0", "2=0");
193 register_event("Health", "message_health", "be", "1!255");
194 register_event("CurWeapon","cur_weapon", "be", "1=1");
195 register_event("SendAudio", "t_win_round" , "a", "2&%!MRAD_terwin");
196 register_event("SendAudio", "ct_win_round", "a", "2&%!MRAD_ct_win_round");
197 register_event("TextMsg", "hostages_rescued", "a", "2&#All_Hostages_R");
198
199 register_forward(FM_CmdStart, "cmd_start");
200 register_forward(FM_EmitSound, "sound_emit");
201 register_forward(FM_PlayerPreThink, "player_prethink");
202 register_forward(FM_UpdateClientData, "update_client_data", 1);
203
204 register_message(get_user_msgid("SayText"), "say_text");
205 register_message(get_user_msgid("AmmoX"), "message_ammo");
206 register_message(SVC_INTERMISSION, "message_intermission");
207
208 hudSync = CreateHudSyncObj();
209 hudSync2 = CreateHudSyncObj();
210 hudInfo = CreateHudSyncObj();
211
212 codForwards[CLASS_CHANGED] = CreateMultiForward("cod_class_changed", ET_IGNORE, FP_CELL, FP_CELL);
213 codForwards[ITEM_CHANGED] = CreateMultiForward("cod_item_changed", ET_IGNORE, FP_CELL, FP_CELL);
214 codForwards[RENDER_CHANGED] = CreateMultiForward("cod_render_changed", ET_IGNORE, FP_CELL, FP_CELL);
215 codForwards[GRAVITY_CHANGED] = CreateMultiForward("cod_gravity_changed", ET_IGNORE, FP_CELL, FP_FLOAT);
216 codForwards[SPEED_CHANGED] = CreateMultiForward("cod_speed_changed", ET_IGNORE, FP_CELL, FP_FLOAT);
217 codForwards[DAMAGE_PRE] = CreateMultiForward ("cod_damage_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL, FP_FLOAT, FP_CELL, FP_CELL);
218 codForwards[DAMAGE_POST] = CreateMultiForward ("cod_damage_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL, FP_FLOAT, FP_CELL, FP_CELL);
219 codForwards[WEAPON_DEPLOY] = CreateMultiForward("cod_weapon_deploy", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL);
220 codForwards[CUR_WEAPON] = CreateMultiForward("cod_cur_weapon", ET_IGNORE, FP_CELL, FP_CELL);
221 codForwards[KILLED] = CreateMultiForward("cod_killed", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
222 codForwards[SPAWNED] = CreateMultiForward("cod_spawned", ET_IGNORE, FP_CELL, FP_CELL);
223 codForwards[CMD_START] = CreateMultiForward("cod_cmd_start", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
224 codForwards[PRETHINK] = CreateMultiForward("cod_player_prethink", ET_IGNORE, FP_CELL);
225 codForwards[NEW_ROUND] = CreateMultiForward("cod_new_round", ET_IGNORE);
226 codForwards[START_ROUND] = CreateMultiForward("cod_start_round", ET_IGNORE);
227 codForwards[END_ROUND] = CreateMultiForward("cod_end_round", ET_IGNORE);
228 codForwards[END_MAP] = CreateMultiForward("cod_end_map", ET_IGNORE);
229 codForwards[MEDKIT_HEAL] = CreateMultiForward("cod_medkit_heal", ET_CONTINUE, FP_CELL, FP_CELL, FP_FLOAT);
230 codForwards[ROCKET_EXPLODE] = CreateMultiForward("cod_rocket_explode", ET_CONTINUE, FP_CELL, FP_CELL, FP_FLOAT);
231 codForwards[MINE_EXPLODE] = CreateMultiForward("cod_mine_explode", ET_CONTINUE, FP_CELL, FP_CELL, FP_FLOAT);
232 codForwards[DYNAMITE_EXPLODE] = CreateMultiForward("cod_dynamite_explode", ET_CONTINUE, FP_CELL, FP_CELL, FP_FLOAT);
233 codForwards[THUNDER_REACH] = CreateMultiForward("cod_thunder_reach", ET_CONTINUE, FP_CELL, FP_CELL, FP_FLOAT);
234 codForwards[TELEPORT_USED] = CreateMultiForward("cod_teleport_used", ET_CONTINUE, FP_CELL);
235}
236
237public plugin_natives()
238{
239 register_native("cod_get_user_exp", "_cod_get_user_exp", 1);
240 register_native("cod_set_user_exp", "_cod_set_user_exp", 1);
241 register_native("cod_get_user_bonus_exp", "_cod_get_user_bonus_exp", 1);
242 register_native("cod_get_level_exp", "_cod_get_level_exp", 1);
243 register_native("cod_get_user_level", "_cod_get_user_level", 1);
244 register_native("cod_get_user_highest_level", "_cod_get_user_highest_level", 1);
245
246 register_native("cod_get_user_class", "_cod_get_user_class", 1);
247 register_native("cod_get_user_class_name", "_cod_get_user_class_name", 1);
248 register_native("cod_set_user_class", "_cod_set_user_class", 1);
249 register_native("cod_get_class_id", "_cod_get_class_id", 1);
250 register_native("cod_get_class_name", "_cod_get_class_name", 1);
251 register_native("cod_get_class_desc", "_cod_get_class_desc", 1);
252 register_native("cod_get_class_health", "_cod_get_class_health", 1);
253 register_native("cod_get_class_intelligence", "_cod_get_class_intelligence", 1);
254 register_native("cod_get_class_stamina", "_cod_get_class_stamina", 1);
255 register_native("cod_get_class_strength", "_cod_get_class_strength", 1);
256 register_native("cod_get_class_condition", "_cod_get_class_condition", 1);
257 register_native("cod_get_classes_num", "_cod_get_classes_num", 1);
258
259 register_native("cod_get_user_promotion", "_cod_get_user_promotion", 1);
260 register_native("cod_get_user_promotion_id", "_cod_get_user_promotion_id", 1);
261
262 register_native("cod_get_user_item", "_cod_get_user_item", 1);
263 register_native("cod_get_user_item_value", "_cod_get_user_item_value", 1);
264 register_native("cod_get_user_item_name", "_cod_get_user_item_name", 1);
265 register_native("cod_set_user_item", "_cod_set_user_item", 1);
266 register_native("cod_upgrade_user_item", "_cod_upgrade_user_item", 1)
267 register_native("cod_get_item_id", "_cod_get_item_id", 1);
268 register_native("cod_get_item_name", "_cod_get_item_name", 1);
269 register_native("cod_get_item_desc", "_cod_get_item_desc", 1);
270 register_native("cod_get_items_num", "_cod_get_items_num", 1);
271
272 register_native("cod_get_item_durability", "_cod_get_item_durability", 1);
273 register_native("cod_set_item_durability", "_cod_set_item_durability", 1);
274 register_native("cod_max_item_durability", "_cod_max_item_durability", 1);
275
276 register_native("cod_get_user_max_health", "_cod_get_user_max_health", 1);
277 register_native("cod_get_user_health", "_cod_get_user_health", 1);
278 register_native("cod_set_user_health", "_cod_set_user_health", 1);
279 register_native("cod_add_user_health", "_cod_add_user_health", 1);
280
281 register_native("cod_get_user_health", "_cod_get_user_health", 1);
282 register_native("cod_get_user_intelligence", "_cod_get_user_intelligence", 1);
283 register_native("cod_get_user_stamina", "_cod_get_user_stamina", 1);
284 register_native("cod_get_user_strength", "_cod_get_user_strength", 1);
285 register_native("cod_get_user_condition", "_cod_get_user_condition", 1);
286
287 register_native("cod_get_user_bonus_health", "_cod_get_user_bonus_health", 1);
288 register_native("cod_get_user_bonus_intelligence", "_cod_get_user_bonus_intelligence", 1);
289 register_native("cod_get_user_bonus_stamina", "_cod_get_user_bonus_stamina", 1);
290 register_native("cod_get_user_bonus_strength", "_cod_get_user_bonus_strength", 1);
291 register_native("cod_get_user_bonus_condition", "_cod_get_user_bonus_condition", 1);
292
293 register_native("cod_set_user_bonus_health", "_cod_set_user_bonus_health", 1);
294 register_native("cod_set_user_bonus_intelligence", "_cod_set_user_bonus_intelligence", 1);
295 register_native("cod_set_user_bonus_stamina", "_cod_set_user_bonus_stamina", 1);
296 register_native("cod_set_user_bonus_strength", "_cod_set_user_bonus_strength", 1);
297 register_native("cod_set_user_bonus_condition", "_cod_set_user_bonus_condition", 1);
298
299 register_native("cod_add_user_bonus_health", "_cod_add_user_bonus_health", 1);
300 register_native("cod_add_user_bonus_intelligence", "_cod_add_user_bonus_intelligence", 1);
301 register_native("cod_add_user_bonus_stamina", "_cod_add_user_bonus_stamina", 1);
302 register_native("cod_add_user_bonus_strength", "_cod_add_user_bonus_strength", 1);
303 register_native("cod_add_user_bonus_condition", "_cod_add_user_bonus_condition", 1);
304
305 register_native("cod_get_user_rockets", "_cod_get_user_rockets", 1);
306 register_native("cod_get_user_mines", "_cod_get_user_mines", 1);
307 register_native("cod_get_user_dynamites", "_cod_get_user_dynamites", 1);
308 register_native("cod_get_user_thunders", "_cod_get_user_thunders", 1);
309 register_native("cod_get_user_medkits", "_cod_get_user_medkits", 1);
310 register_native("cod_get_user_teleports", "_cod_get_user_teleports", 1);
311 register_native("cod_get_user_multijumps", "_cod_get_user_multijumps", 1);
312 register_native("cod_get_user_gravity", "_cod_get_user_gravity", 1);
313 register_native("cod_get_user_speed", "_cod_get_user_speed", 1);
314 register_native("cod_get_user_armor", "_cod_get_user_armor", 1);
315 register_native("cod_get_user_money", "_cod_get_user_money", 1);
316
317 register_native("cod_set_user_rockets", "_cod_set_user_rockets", 1);
318 register_native("cod_set_user_mines", "_cod_set_user_mines", 1);
319 register_native("cod_set_user_dynamites", "_cod_set_user_dynamites", 1);
320 register_native("cod_set_user_thunders", "_cod_set_user_thunders", 1);
321 register_native("cod_set_user_medkits", "_cod_set_user_medkits", 1);
322 register_native("cod_set_user_teleports", "_cod_set_user_teleports", 1);
323 register_native("cod_set_user_multijumps", "_cod_set_user_multijumps", 1);
324 register_native("cod_set_user_gravity", "_cod_set_user_gravity", 1);
325 register_native("cod_set_user_speed", "_cod_set_user_speed", 1);
326 register_native("cod_set_user_armor", "_cod_set_user_armor", 1);
327 register_native("cod_set_user_money", "_cod_set_user_money", 1);
328
329 register_native("cod_add_user_rockets", "_cod_add_user_rockets", 1);
330 register_native("cod_add_user_mines", "_cod_add_user_mines", 1);
331 register_native("cod_add_user_dynamites", "_cod_add_user_dynamites", 1);
332 register_native("cod_add_user_thunders", "_cod_add_user_thunders", 1);
333 register_native("cod_add_user_medkits", "_cod_add_user_medkits", 1);
334 register_native("cod_add_user_teleports", "_cod_add_user_teleports", 1);
335 register_native("cod_add_user_multijumps", "_cod_add_user_multijumps", 1);
336 register_native("cod_add_user_gravity", "_cod_add_user_gravity", 1);
337 register_native("cod_add_user_speed", "_cod_add_user_speed", 1);
338 register_native("cod_add_user_armor", "_cod_add_user_armor", 1);
339 register_native("cod_add_user_money", "_cod_add_user_money", 1);
340
341 register_native("cod_use_user_rocket", "_cod_use_user_rocket", 1);
342 register_native("cod_use_user_mine", "_cod_use_user_mine", 1);
343 register_native("cod_use_user_dynamite", "_cod_use_user_dynamite", 1);
344 register_native("cod_use_user_thunder", "_cod_use_user_thunder", 1);
345 register_native("cod_use_user_medkit", "_cod_use_user_medkit", 1);
346 register_native("cod_use_user_teleport", "_cod_use_user_teleport", 1);
347
348 register_native("cod_get_user_bunnyhop", "_cod_get_user_bunnyhop", 1);
349 register_native("cod_get_user_footsteps", "_cod_get_user_footsteps", 1);
350 register_native("cod_get_user_model", "_cod_get_user_model", 1);
351 register_native("cod_get_user_resistance", "_cod_get_user_resistance", 1);
352 register_native("cod_get_user_godmode", "_cod_get_user_godmode", 1);
353 register_native("cod_get_user_noclip", "_cod_get_user_noclip", 1);
354 register_native("cod_get_user_unlimited_ammo", "_cod_get_user_unlimited_ammo", 1);
355 register_native("cod_get_user_recoil_eliminator", "_cod_get_user_recoil_eliminator", 1);
356 register_native("cod_get_user_recoil_reducer", "_cod_get_user_recoil_reducer", 1);
357
358 register_native("cod_set_user_bunnyhop", "_cod_set_user_bunnyhop", 1);
359 register_native("cod_set_user_footsteps", "_cod_set_user_footsteps", 1);
360 register_native("cod_set_user_model", "_cod_set_user_model", 1);
361 register_native("cod_set_user_resistance", "_cod_set_user_resistance", 1);
362 register_native("cod_set_user_godmode", "_cod_set_user_godmode", 1);
363 register_native("cod_set_user_noclip", "_cod_set_user_noclip", 1);
364 register_native("cod_set_user_unlimited_ammo", "_cod_set_user_unlimited_ammo", 1);
365 register_native("cod_set_user_recoil_eliminator", "_cod_set_user_recoil_eliminator", 1);
366 register_native("cod_set_user_recoil_reducer", "_cod_set_user_recoil_reducer", 1);
367
368 register_native("cod_give_weapon", "_cod_give_weapon", 1);
369 register_native("cod_take_weapon", "_cod_take_weapon", 1);
370 register_native("cod_get_user_weapon", "_cod_get_user_weapon", 1);
371
372 register_native("cod_get_user_render", "_cod_get_user_render", 1);
373 register_native("cod_set_user_render", "_cod_set_user_render", 1);
374 register_native("cod_set_user_glow", "_cod_set_user_glow", 1);
375
376 register_native("cod_print_chat", "_cod_print_chat", 1);
377 register_native("cod_log_error", "_cod_log_error", 1);
378 register_native("cod_show_hud", "_cod_show_hud", 1);
379 register_native("cod_cmd_execute", "_cod_cmd_execute", 1);
380 register_native("cod_sql_string", "_cod_sql_string", 1);
381 register_native("cod_make_bartimer", "_cod_make_bartimer", 1);
382 register_native("cod_display_fade", "_cod_display_fade", 1);
383 register_native("cod_display_icon", "_cod_display_icon", 1);
384 register_native("cod_screen_shake", "_cod_screen_shake", 1);
385 register_native("cod_refill_ammo", "_cod_refill_ammo", 1);
386 register_native("cod_make_explosion", "_cod_make_explosion", 1);
387 register_native("cod_repeat_damage", "_cod_repeat_damage", 1);
388 register_native("cod_inflict_damage", "_cod_inflict_damage", 1);
389 register_native("cod_kill_player", "_cod_kill_player", 1);
390 register_native("cod_respawn_player", "_cod_respawn_player", 1);
391 register_native("cod_teleport_to_spawn", "_cod_teleport_to_spawn", 1);
392 register_native("cod_random_upgrade", "_cod_random_upgrade", 1);
393 register_native("cod_percent_chance", "_cod_percent_chance", 1);
394 register_native("cod_is_enough_space", "_cod_is_enough_space", 1);
395 register_native("cod_remove_ents", "_cod_remove_ents", 1);
396
397 register_native("cod_register_item", "_cod_register_item");
398 register_native("cod_register_class", "_cod_register_class");
399 register_native("cod_register_promotion", "_cod_register_promotion");
400}
401
402public plugin_cfg()
403{
404 new configPath[64];
405
406 get_localinfo("amxx_configsdir", configPath, charsmax(configPath));
407
408 server_cmd("exec %s/cod_mod.cfg", configPath);
409 server_exec();
410
411 server_cmd("sv_maxspeed 500");
412
413 sql_init();
414
415 if (cvarNightExpEnabled) {
416 set_task(5.0, "check_time", _, _, _, "b");
417 set_task(240.0, "night_exp_info", _, _, _, "b");
418 }
419
420 log_amx("Call of Duty Mod autorstwa O'Zone (v%s).", VERSION);
421 log_amx("Zaladowano %i klas i %i przedmiotow.", ArraySize(codClasses) - 1, ArraySize(codItems) - 1);
422}
423
424public plugin_end()
425{
426 SQL_FreeHandle(sql);
427 SQL_FreeHandle(connection);
428
429 for (new i = 0; i < sizeof codForwards; i++) DestroyForward(i);
430 for (new i = 0; i < ArraySize(codItems); i++) for (new j = ITEM_GIVE; j <= ITEM_UPGRADE; j++) DestroyForward(get_item_info(i, j));
431 for (new i = 0; i < ArraySize(codClasses); i++) for (new j = CLASS_ENABLED; j <= CLASS_SKILL_USED; j++) DestroyForward(get_class_info(i, j));
432
433 ArrayDestroy(codItems);
434 ArrayDestroy(codClasses);
435 ArrayDestroy(codPromotions);
436 ArrayDestroy(codFractions);
437
438 for (new i = 1; i <= MAX_PLAYERS; i++)
439 {
440 ArrayDestroy(codPlayerClasses[i]);
441 ArrayDestroy(codPlayerRender[i]);
442 }
443}
444
445public plugin_precache()
446{
447 for (new i = 0; i < sizeof codSounds; i++) precache_sound(codSounds[i]);
448 for (new i = 0; i < sizeof codModels; i++) precache_model(codModels[i]);
449 for (new i = 0; i < sizeof codSprites; i++) codSprite[i] = precache_model(codSprites[i]);
450}
451
452public client_connect(id)
453{
454 reset_player(id);
455
456 if (is_user_bot(id) || is_user_hltv(id)) return;
457
458 ArrayClear(codPlayerClasses[id]);
459
460 new codPlayerClass[playerClassInfo];
461
462 for (new i = 0; i < ArraySize(codClasses); i++) ArrayPushArray(codPlayerClasses[id], codPlayerClass);
463
464 get_user_name(id, codPlayer[id][PLAYER_NAME], charsmax(codPlayer[]));
465
466 sql_string(codPlayer[id][PLAYER_NAME], codPlayer[id][PLAYER_NAME], charsmax(codPlayer[]));
467
468 set_task(0.1, "load_data", id);
469}
470
471public client_putinserver(id)
472{
473 playersNum++;
474
475 set_bit(id, userConnected);
476
477 show_bonus_info();
478
479 if (is_user_bot(id) || is_user_hltv(id)) return;
480
481 set_task(20.0, "show_advertisement", id + TASK_SHOW_AD);
482 set_task(5.0, "set_speed_limit", id + TASK_SPEED_LIMIT);
483 set_task(90.0, "show_help", id + TASK_SHOW_HELP, .flags = "b");
484 set_task(0.1, "show_info", id + TASK_SHOW_INFO, .flags = "b");
485}
486
487public client_disconnected(id)
488{
489 if (get_bit(id, userConnected)) playersNum--;
490
491 save_data(id, mapChange ? MAP_END : FINAL);
492
493 remove_tasks(id);
494
495 remove_ents(id);
496
497 if (!mapChange) {
498 if (codPlayer[id][PLAYER_CLASS]) execute_forward_ignore_one_param(get_class_info(codPlayer[id][PLAYER_CLASS], CLASS_DISABLED), id);
499 if (codPlayer[id][PLAYER_ITEM]) execute_forward_ignore_one_param(get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_DROP), id);
500 }
501}
502
503public create_arrays()
504{
505 new codItem[itemInfo], codClass[classInfo], codRender[renderInfo];
506
507 codItems = ArrayCreate(itemInfo);
508 codClasses = ArrayCreate(classInfo);
509 codPromotions = ArrayCreate(classInfo);
510 codFractions = ArrayCreate(MAX_NAME);
511
512 for (new i = 1; i <= MAX_PLAYERS; i++) {
513 codPlayerClasses[i] = ArrayCreate(playerClassInfo);
514 codPlayerRender[i] = ArrayCreate(renderInfo);
515 }
516
517 formatex(codItem[ITEM_NAME], charsmax(codItem[ITEM_NAME]), "Brak");
518 formatex(codItem[ITEM_DESC], charsmax(codItem[ITEM_DESC]), "Zabij kogos, aby zdobyc przedmiot");
519
520 ArrayPushArray(codItems, codItem);
521
522 formatex(codClass[CLASS_NAME], charsmax(codClass[CLASS_NAME]), "Brak");
523
524 ArrayPushArray(codClasses, codClass);
525
526 codRender[RENDER_VALUE] = 256;
527
528 for (new i = 1; i <= MAX_PLAYERS; i++) {
529 for (new j = CLASS; j <= ADDITIONAL; j++) {
530 codRender[RENDER_TYPE] = j;
531
532 ArrayPushArray(codPlayerRender[i], codRender);
533 }
534 }
535}
536
537public select_fraction(id)
538{
539 if (!is_user_connected(id) || !cod_check_account(id)) return PLUGIN_HANDLED;
540
541 if (!get_bit(id, dataLoaded)) {
542 chat_print(id, "Trwa wczytywanie twoich klas...");
543
544 return PLUGIN_HANDLED;
545 }
546
547 if (ArraySize(codFractions)) {
548 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
549
550 new fractionName[MAX_NAME], menu = menu_create("\yWybierz \rFrakcje\w:", "select_fraction_handle");
551
552 for (new i = 0; i < ArraySize(codFractions); i++) {
553 ArrayGetString(codFractions, i, fractionName, charsmax(fractionName));
554
555 menu_additem(menu, fractionName, fractionName);
556 }
557
558 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
559 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
560 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
561
562 menu_display(id, menu);
563 } else select_class(id);
564
565 return PLUGIN_HANDLED;
566}
567
568public select_fraction_handle(id, menu, item)
569{
570 if (!is_user_connected(id)) return PLUGIN_HANDLED;
571
572 if (item == MENU_EXIT) {
573 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
574
575 menu_destroy(menu);
576
577 return PLUGIN_HANDLED;
578 }
579
580 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
581
582 new menuData[128], menuClassName[MAX_NAME], menuClassId[5], itemData[MAX_NAME], classId = codPlayer[id][PLAYER_CLASS], codClass[classInfo], itemAccess, itemCallback;
583
584 menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, itemCallback);
585
586 menu_destroy(menu);
587
588 new menu = menu_create("\yWybierz \rKlase\w:", "select_class_confirm");
589
590 for (new i = 1; i < ArraySize(codClasses); i++) {
591 ArrayGetArray(codClasses, i, codClass);
592
593 if (equal(itemData, codClass[CLASS_FRACTION])) {
594 load_class(id, i);
595
596 if (codPlayer[id][PLAYER_PROMOTION]) get_user_class_info(id, i, CLASS_NAME, menuClassName, charsmax(menuClassName));
597 else formatex(menuClassName, charsmax(menuClassName), codClass[CLASS_NAME]);
598
599 formatex(menuData, charsmax(menuData), "%s \yPoziom: %i \d(%s)", menuClassName, codPlayer[id][PLAYER_LEVEL], get_weapons(codPlayer[id][PLAYER_WEAPONS]));
600
601 num_to_str(i, menuClassId, charsmax(menuClassId));
602
603 menu_additem(menu, menuData, menuClassId);
604 }
605 }
606
607 load_class(id, classId);
608
609 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
610 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
611 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
612
613 menu_display(id, menu);
614
615 return PLUGIN_HANDLED;
616}
617
618public select_class(id)
619{
620 if (!is_user_connected(id) || !cod_check_account(id)) return PLUGIN_HANDLED;
621
622 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
623
624 new menuData[128], menuClassName[MAX_NAME], menuClassId[5], codClass[classInfo], classId = codPlayer[id][PLAYER_CLASS], menu = menu_create("\yWybierz \rKlase\w:", "select_class_confirm");
625
626 for (new i = 1; i < ArraySize(codClasses); i++) {
627 ArrayGetArray(codClasses, i, codClass);
628
629 load_class(id, i);
630
631 if (codPlayer[id][PLAYER_PROMOTION]) get_user_class_info(id, i, CLASS_NAME, menuClassName, charsmax(menuClassName));
632 else formatex(menuClassName, charsmax(menuClassName), codClass[CLASS_NAME]);
633
634 formatex(menuData, charsmax(menuData), "%s \yPoziom: %i \d(%s)", menuClassName, codPlayer[id][PLAYER_LEVEL], get_weapons(codPlayer[id][PLAYER_WEAPONS]));
635
636 num_to_str(i, menuClassId, charsmax(menuClassId));
637
638 menu_additem(menu, menuData, menuClassId);
639 }
640
641 load_class(id, classId);
642
643 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
644 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
645 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
646
647 menu_display(id, menu);
648
649 return PLUGIN_CONTINUE;
650}
651
652public select_class_confirm(id, menu, item)
653{
654 if (!is_user_connected(id)) return PLUGIN_HANDLED;
655
656 if (item == MENU_EXIT) {
657 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
658
659 menu_destroy(menu);
660
661 return PLUGIN_HANDLED;
662 }
663
664 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
665
666 new menuData[512], codClass[classInfo], itemData[5], itemAccess, itemCallback, classId = codPlayer[id][PLAYER_CLASS];
667
668 menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, itemCallback);
669
670 new class = str_to_num(itemData);
671
672 menu_destroy(menu);
673
674 if (class == codPlayer[id][PLAYER_CLASS] && !codPlayer[id][PLAYER_NEW_CLASS]) {
675 chat_print(id, "To twoja aktualnie wybrana klasa.");
676
677 return PLUGIN_CONTINUE;
678 }
679
680 new flag = get_class_info(class, CLASS_FLAG);
681
682 if (flag != NONE && !(get_user_flags(id) & flag)) {
683 chat_print(id, "Nie posiadasz uprawnien do korzystania z tej klasy. Wykup je w^x03 /sklepsms^x01!");
684
685 return PLUGIN_CONTINUE;
686 }
687
688 load_class(id, class);
689
690 if (codPlayer[id][PLAYER_PROMOTION]) ArrayGetArray(codPromotions, codPlayer[id][PLAYER_PROMOTION_ID], codClass);
691 else ArrayGetArray(codClasses, class, codClass);
692
693 new classDesc[64][32], descFirstLine[75], descSecondLine[75], descWords;
694
695 descWords = explode_string(codClass[CLASS_DESC], " ", classDesc, charsmax(classDesc), charsmax(classDesc[]));
696
697 formatex(descSecondLine, charsmax(descSecondLine), "^n");
698
699 for (new i = 0; i < descWords; i++) {
700 if (strlen(descFirstLine) + strlen(classDesc[i]) < charsmax(descFirstLine)) format(descFirstLine, charsmax(descFirstLine), "%s%s%s", descFirstLine, strlen(descFirstLine) ? " " : "", classDesc[i]);
701 else format(descSecondLine, charsmax(descSecondLine), "%s%s%s", descSecondLine, strlen(descSecondLine) > 2 ? " " : "", classDesc[i]);
702 }
703
704 format(menuData, charsmax(menuData), "\yKlasa: \r%s^n\yBronie:\w %s^n\yZdrowie: \w%i^n\yInteligencja: \w%i^n\ySila: \w%i^n\yWytrzymalosc: \w%i^n\yKondycja: \w%i^n\yOpis: \w%s%s^n",
705 codClass[CLASS_NAME], get_weapons(codClass[CLASS_WEAPONS]), codClass[CLASS_HEAL], codClass[CLASS_INT], codClass[CLASS_STR], codClass[CLASS_STAM], codClass[CLASS_COND], descFirstLine, descSecondLine);
706
707 menu = menu_create(menuData, "select_class_confirm_handle");
708
709 menu_additem(menu, "\wGraj ta \rKlasa", itemData);
710 menu_additem(menu, "\wWroc");
711
712 menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
713
714 menu_display(id, menu);
715
716 load_class(id, classId);
717
718 return PLUGIN_HANDLED;
719}
720
721public select_class_confirm_handle(id, menu, item)
722{
723 if (!is_user_connected(id)) return PLUGIN_HANDLED;
724
725 if (item == MENU_EXIT) {
726 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
727
728 menu_destroy(menu);
729
730 return PLUGIN_HANDLED;
731 }
732
733 if (item) select_fraction(id);
734 else {
735 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
736
737 new itemData[5], itemAccess, itemCallback;
738
739 menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, itemCallback);
740
741 new class = str_to_num(itemData);
742
743 codPlayer[id][PLAYER_NEW_CLASS] = class;
744
745 if (codPlayer[id][PLAYER_CLASS]) chat_print(id, "Klasa zostanie zmieniona w nastepnej rundzie.");
746 else set_new_class(id);
747 }
748
749 menu_destroy(menu);
750
751 return PLUGIN_HANDLED;
752}
753
754public display_classes_description(id, class, sound)
755{
756 if (!is_user_connected(id)) return PLUGIN_HANDLED;
757
758 if (sound) client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
759
760 new className[MAX_NAME], classId[5], menu = menu_create("\yWybierz \rKlase\w:", "display_classes_description_handle");
761
762 for (new i = 1; i < ArraySize(codClasses); i++) {
763 get_class_info(i, CLASS_NAME, className, charsmax(className));
764
765 num_to_str(i, classId, charsmax(classId));
766
767 menu_additem(menu, className, classId);
768 }
769
770 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
771 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
772 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
773
774 menu_display(id, menu, class / 7);
775
776 return PLUGIN_HANDLED;
777}
778
779public display_classes_description_handle(id, menu, item)
780{
781 if (!is_user_connected(id)) return PLUGIN_HANDLED;
782
783 if (item == MENU_EXIT) {
784 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
785
786 menu_destroy(menu);
787
788 return PLUGIN_HANDLED;
789 }
790
791 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
792
793 new menuData[512], codClass[classInfo], classId[5], promotionData[10], itemAccess, itemCallback;
794
795 menu_item_getinfo(menu, item, itemAccess, classId, charsmax(classId), _, _, itemCallback);
796
797 new class = str_to_num(classId), promotion = find_class_promotion(class);
798
799 menu_destroy(menu);
800
801 ArrayGetArray(codClasses, class, codClass);
802
803 new classDesc[64][32], descFirstLine[75], descSecondLine[75], descWords;
804
805 descWords = explode_string(codClass[CLASS_DESC], " ", classDesc, charsmax(classDesc), charsmax(classDesc[]));
806
807 formatex(descSecondLine, charsmax(descSecondLine), "^n");
808
809 for (new i = 0; i < descWords; i++) {
810 if (strlen(descFirstLine) + strlen(classDesc[i]) < charsmax(descFirstLine)) format(descFirstLine, charsmax(descFirstLine), "%s%s%s", descFirstLine, strlen(descFirstLine) ? " " : "", classDesc[i]);
811 else format(descSecondLine, charsmax(descSecondLine), "%s%s%s", descSecondLine, strlen(descSecondLine) > 2 ? " " : "", classDesc[i]);
812 }
813
814 format(menuData, charsmax(menuData), "\yKlasa: \r%s^n\yBronie:\w %s^n\yZdrowie: \w%i^n\yInteligencja: \w%i^n\ySila: \w%i^n\yWytrzymalosc: \w%i^n\yKondycja: \w%i^n\yOpis: \w%s%s^n",
815 codClass[CLASS_NAME], get_weapons(codClass[CLASS_WEAPONS]), codClass[CLASS_HEAL], codClass[CLASS_INT], codClass[CLASS_STR], codClass[CLASS_STAM], codClass[CLASS_COND], descFirstLine, descSecondLine);
816
817 menu = menu_create(menuData, "classes_description_handle");
818
819 if (promotion > PROMOTION_NONE) {
820 new menuData[128], className[MAX_NAME];
821
822 formatex(promotionData, charsmax(promotionData), "%i#%i", class, promotion);
823
824 get_class_promotion_info(class, promotion, CLASS_NAME, className, charsmax(className));
825
826 formatex(menuData, charsmax(menuData), "\wPokaz \yAwans\w - \r%s \w(\r%i Poziom\w)", className, get_class_promotion_info(class, promotion, CLASS_LEVEL));
827
828 menu_additem(menu, menuData, promotionData);
829 }
830
831 menu_additem(menu, "Wroc", classId);
832 menu_additem(menu, "Wyjscie");
833
834 menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
835
836 menu_display(id, menu);
837
838 return PLUGIN_HANDLED;
839}
840
841public classes_description_handle(id, menu, item)
842{
843 if (!is_user_connected(id)) return PLUGIN_HANDLED;
844
845 new itemData[10], itemAccess, itemCallback;
846
847 menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, itemCallback);
848
849 if (!itemData[0]) {
850 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
851
852 menu_destroy(menu);
853
854 return PLUGIN_HANDLED;
855 }
856
857 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
858
859 menu_destroy(menu);
860
861 if (containi(itemData, "#") != NONE) {
862 new classId[5], promotionId[5];
863
864 strtok(itemData, classId, charsmax(classId), promotionId, charsmax(promotionId), '#');
865
866 display_promotions_description(id, str_to_num(classId), str_to_num(promotionId));
867 } else display_classes_description(id, str_to_num(itemData), 1);
868
869 return PLUGIN_HANDLED;
870}
871
872public display_promotions_description(id, class, promotion)
873{
874 if (!is_user_connected(id)) return PLUGIN_HANDLED;
875
876 new classDesc[64][32], codClass[classInfo], menuData[512], descFirstLine[75], descSecondLine[75], promotionData[10], classId[5], descWords;
877
878 num_to_str(class, classId, charsmax(classId));
879
880 ArrayGetArray(codPromotions, get_class_promotion_info(class, promotion, CLASS_PROMOTION), codClass);
881
882 descWords = explode_string(codClass[CLASS_DESC], " ", classDesc, charsmax(classDesc), charsmax(classDesc[]));
883
884 formatex(descSecondLine, charsmax(descSecondLine), "^n");
885
886 for (new i = 0; i < descWords; i++) {
887 if (strlen(descFirstLine) + strlen(classDesc[i]) < charsmax(descFirstLine)) format(descFirstLine, charsmax(descFirstLine), "%s%s%s", descFirstLine, strlen(descFirstLine) ? " " : "", classDesc[i]);
888 else format(descSecondLine, charsmax(descSecondLine), "%s%s%s", descSecondLine, strlen(descSecondLine) > 2 ? " " : "", classDesc[i]);
889 }
890
891 format(menuData, charsmax(menuData), "\yKlasa: \w%s^n\yBronie:\w %s^n\yZdrowie: \w%i^n\yInteligencja: \w%i^n\ySila: \w%i^n\yWytrzymalosc: \w%i^n\yKondycja: \w%i^n\yOpis: \w%s%s^n",
892 codClass[CLASS_NAME], get_weapons(codClass[CLASS_WEAPONS]), codClass[CLASS_HEAL], codClass[CLASS_INT], codClass[CLASS_STR], codClass[CLASS_STAM], codClass[CLASS_COND], descFirstLine, descSecondLine);
893
894 new menu = menu_create(menuData, "classes_description_handle"), classPromotion = find_class_promotion(class, promotion);
895
896 if (classPromotion > PROMOTION_NONE) {
897 new menuData[128], className[MAX_NAME];
898
899 formatex(promotionData, charsmax(promotionData), "%i#%i", class, classPromotion);
900
901 get_class_promotion_info(class, classPromotion, CLASS_NAME, className, charsmax(className));
902
903 formatex(menuData, charsmax(menuData), "\wPokaz \yAwans\w - \r%s \w(\r%i Poziom\w)", className, get_class_promotion_info(class, classPromotion, CLASS_LEVEL));
904
905 menu_additem(menu, menuData, promotionData);
906 }
907
908 menu_additem(menu, "Wroc", classId);
909 menu_additem(menu, "Wyjscie");
910
911 menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
912
913 menu_display(id, menu);
914
915 return PLUGIN_HANDLED;
916}
917
918public display_item_description(id)
919{
920 show_item_description(id, codPlayer[id][PLAYER_ITEM], 0);
921
922 return PLUGIN_HANDLED;
923}
924
925public display_items_description(id, page, sound)
926{
927 if (!is_user_connected(id)) return PLUGIN_HANDLED;
928
929 if (sound) client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
930
931 new itemName[MAX_NAME], menu = menu_create("\yWybierz \rPrzedmiot\w:", "display_items_description_handle");
932
933 for (new i = 1; i < ArraySize(codItems); i++) {
934 get_item_info(i, ITEM_NAME, itemName, charsmax(itemName));
935
936 menu_additem(menu, itemName);
937 }
938
939 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
940 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
941 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
942
943 menu_display(id, menu, page);
944
945 return PLUGIN_HANDLED;
946}
947
948public display_items_description_handle(id, menu, item)
949{
950 if (!is_user_connected(id)) return PLUGIN_HANDLED;
951
952 if (item == MENU_EXIT) {
953 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
954
955 menu_destroy(menu);
956
957 return PLUGIN_HANDLED;
958 }
959
960 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
961
962 menu_destroy(menu);
963
964 show_item_description(id, item + 1, 1);
965
966 display_items_description(id, item / 7, 1);
967
968 return PLUGIN_HANDLED;
969}
970
971public show_item_description(id, item, info)
972{
973 new itemDescription[MAX_DESC], itemName[MAX_NAME], valueRandom[MAX_NAME / 4];
974
975 get_item_info(item, ITEM_DESC, itemDescription, charsmax(itemDescription));
976 get_item_info(item, ITEM_NAME, itemName, charsmax(itemName));
977 new valueMin = get_item_info(item, ITEM_RANDOM_MIN), valueMax = get_item_info(item, ITEM_RANDOM_MAX);
978
979 chat_print(id, "Przedmiot:^x03 %s^x01.", itemName);
980
981 if (get_item_info(item, ITEM_VALUE) > 0) {
982 if (!info) {
983 new itemValue[6], itemTempValue = _cod_get_user_item_value(id);
984
985 num_to_str(itemTempValue, itemValue, charsmax(itemValue));
986
987 format(itemDescription, charsmax(itemDescription), itemDescription, itemValue);
988
989 chat_print(id, "Opis:^x03 %s^x01.", itemDescription);
990 } else {
991 if (valueMin & valueMax) formatex(valueRandom, charsmax(valueRandom), "%i-%i", valueMin, valueMax);
992 else if (valueMin) formatex(valueRandom, charsmax(valueRandom), "%i", valueMin);
993 else valueRandom = "x";
994
995 format(itemDescription, charsmax(itemDescription), itemDescription, valueRandom);
996
997 chat_print(id, "Opis:^x03 %s^x01.", itemDescription);
998 }
999 } else chat_print(id, "Opis:^x03 %s^x01.", itemDescription);
1000
1001 return PLUGIN_HANDLED;
1002}
1003
1004public drop_item(id)
1005{
1006 if (codPlayer[id][PLAYER_ITEM]) {
1007 new itemName[MAX_NAME];
1008
1009 get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_NAME, itemName, charsmax(itemName));
1010
1011 chat_print(id, "Wyrzuciles przedmiot:^x03 %s^x01.", itemName);
1012
1013 set_item(id);
1014 } else chat_print(id, "Nie masz zadnego^x03 przedmiotu^x01.");
1015
1016 return PLUGIN_HANDLED;
1017}
1018
1019public reset_stats(id)
1020{
1021 if (!cod_check_account(id)) return PLUGIN_HANDLED;
1022
1023 if (!is_user_alive(id)) {
1024 reset_points(id);
1025
1026 return PLUGIN_CONTINUE;
1027 }
1028
1029 set_bit(id, resetStats);
1030
1031 chat_print(id, "Twoje punkty umiejetnosci zostana zresetowane w kolejnej rudzie.");
1032
1033 return PLUGIN_HANDLED;
1034}
1035
1036public reset_points(id)
1037{
1038 if (!is_user_connected(id)) return;
1039
1040 rem_bit(id, resetStats);
1041
1042 codPlayer[id][PLAYER_POINTS] = (codPlayer[id][PLAYER_LEVEL] - 1);
1043 codPlayer[id][PLAYER_INT] = 0;
1044 codPlayer[id][PLAYER_HEAL] = 0;
1045 codPlayer[id][PLAYER_COND] = 0;
1046 codPlayer[id][PLAYER_STR] = 0;
1047 codPlayer[id][PLAYER_STAM] = 0;
1048
1049 if (codPlayer[id][PLAYER_POINTS]) assign_points(id, 0);
1050}
1051
1052public assign_points(id, sound)
1053{
1054 if (!is_user_connected(id) || !cod_check_account(id)) return PLUGIN_HANDLED;
1055
1056 if (!sound) client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
1057
1058 new menuData[128];
1059
1060 format(menuData, charsmax(menuData), "\yPrzydziel \rPunkty \y(\r%i\y)\w:", codPlayer[id][PLAYER_POINTS]);
1061
1062 new menu = menu_create(menuData, "assign_points_handler");
1063
1064 if (pointsDistribution[codPlayer[id][PLAYER_POINTS_SPEED]] == FULL) format(menuData, charsmax(menuData), "Ile dodawac: \rWszystko \y(Ile punktow dodac do statystyk)");
1065 else format(menuData, charsmax(menuData), "Ile dodawac: \r%d \y(Ile punktow dodac do statystyk)", pointsDistribution[codPlayer[id][PLAYER_POINTS_SPEED]]);
1066
1067 menu_additem(menu, menuData);
1068
1069 menu_addblank(menu, 0);
1070
1071 format(menuData, charsmax(menuData), "Zdrowie: \r%i \y(Zwieksza o %i liczbe punktow zycia)", get_health(id, 1, 1, 1, 0), get_health(id, 1, 1, 1, 0));
1072 menu_additem(menu, menuData);
1073
1074 format(menuData, charsmax(menuData), "Inteligencja: \r%i \y(Zwieksza o %0.1f%s sile itemow i umiejetnosci klas)", get_intelligence(id), get_intelligence(id) / 2.0, "%");
1075 menu_additem(menu, menuData);
1076
1077 format(menuData, charsmax(menuData), "Sila: \r%i \y(Zwieksza o %0.1f zadawane obrazenia)", get_strength(id), get_strength(id) / 10.0);
1078 menu_additem(menu, menuData);
1079
1080 format(menuData, charsmax(menuData), "Wytrzymalosc: \r%i \y(Zmniejsza o %0.1f%s otrzymywane obrazenia)", get_stamina(id), get_stamina(id) / 4.0, "%");
1081 menu_additem(menu, menuData);
1082
1083 format(menuData, charsmax(menuData), "Kondycja: \r%i \y(Zwieksza o %0.1f%s predkosc poruszania)", get_condition(id), get_condition(id) * 0.85 / 250.0 * 100.0, "%");
1084 menu_additem(menu, menuData);
1085
1086 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
1087
1088 menu_display(id, menu);
1089
1090 return PLUGIN_HANDLED;
1091}
1092
1093public assign_points_handler(id, menu, item)
1094{
1095 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1096
1097 if (item == MENU_EXIT) {
1098 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
1099
1100 menu_destroy(menu);
1101
1102 return PLUGIN_HANDLED;
1103 }
1104
1105 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
1106
1107 if (!codPlayer[id][PLAYER_POINTS]) return PLUGIN_CONTINUE;
1108
1109 new statsLimit = cvarLevelLimit / 5;
1110
1111 new pointsDistributionAmount = (pointsDistribution[codPlayer[id][PLAYER_POINTS_SPEED]] == FULL) ? codPlayer[id][PLAYER_POINTS] :
1112 (pointsDistribution[codPlayer[id][PLAYER_POINTS_SPEED]] > codPlayer[id][PLAYER_POINTS] ? codPlayer[id][PLAYER_POINTS] : pointsDistribution[codPlayer[id][PLAYER_POINTS_SPEED]]);
1113
1114 switch (item) {
1115 case 0: if (++codPlayer[id][PLAYER_POINTS_SPEED] >= sizeof pointsDistribution) codPlayer[id][PLAYER_POINTS_SPEED] = 0;
1116 case 1: {
1117 if (codPlayer[id][PLAYER_HEAL] < statsLimit) {
1118 if (pointsDistributionAmount > statsLimit - codPlayer[id][PLAYER_HEAL]) pointsDistributionAmount = statsLimit - codPlayer[id][PLAYER_HEAL];
1119
1120 codPlayer[id][PLAYER_HEAL] += pointsDistributionAmount;
1121 codPlayer[id][PLAYER_POINTS] -= pointsDistributionAmount;
1122 } else chat_print(id, "Maksymalny poziom sily osiagniety!");
1123 }
1124 case 2: {
1125 if (codPlayer[id][PLAYER_INT] < statsLimit) {
1126 if (pointsDistributionAmount > statsLimit - codPlayer[id][PLAYER_INT]) pointsDistributionAmount = statsLimit - codPlayer[id][PLAYER_INT];
1127
1128 codPlayer[id][PLAYER_INT] += pointsDistributionAmount;
1129 codPlayer[id][PLAYER_POINTS] -= pointsDistributionAmount;
1130
1131 } else chat_print(id, "Maksymalny poziom inteligencji osiagniety!");
1132 }
1133 case 3: {
1134 if (codPlayer[id][PLAYER_STR] < statsLimit) {
1135 if (pointsDistributionAmount > statsLimit - codPlayer[id][PLAYER_STR]) pointsDistributionAmount = statsLimit - codPlayer[id][PLAYER_STR];
1136
1137 codPlayer[id][PLAYER_STR] += pointsDistributionAmount;
1138 codPlayer[id][PLAYER_POINTS] -= pointsDistributionAmount;
1139 } else chat_print(id, "Maksymalny poziom sily osiagniety!");
1140 }
1141 case 4: {
1142 if (codPlayer[id][PLAYER_STAM] < statsLimit) {
1143 if (pointsDistributionAmount > statsLimit - codPlayer[id][PLAYER_STAM]) pointsDistributionAmount = statsLimit - codPlayer[id][PLAYER_STAM];
1144
1145 codPlayer[id][PLAYER_STAM] += pointsDistributionAmount;
1146 codPlayer[id][PLAYER_POINTS] -= pointsDistributionAmount;
1147 } else chat_print(id, "Maksymalny poziom wytrzymalosci osiagniety!");
1148 }
1149 case 5: {
1150 if (codPlayer[id][PLAYER_COND] < statsLimit) {
1151 if (pointsDistributionAmount > statsLimit - codPlayer[id][PLAYER_COND]) pointsDistributionAmount = statsLimit - codPlayer[id][PLAYER_COND];
1152
1153 codPlayer[id][PLAYER_COND] += pointsDistributionAmount;
1154 codPlayer[id][PLAYER_POINTS] -= pointsDistributionAmount;
1155 } else chat_print(id, "Maksymalny poziom kondycji osiagniety!");
1156 }
1157 }
1158
1159 if (item) save_data(id, NORMAL);
1160
1161 menu_destroy(menu);
1162
1163 if (codPlayer[id][PLAYER_POINTS] > 0) assign_points(id, 1);
1164
1165 return PLUGIN_HANDLED;
1166}
1167
1168public change_hud(id, sound)
1169{
1170 if (!is_user_connected(id) || !cod_check_account(id)) return PLUGIN_HANDLED;
1171
1172 if (!sound) client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
1173
1174 new menuData[128], menu = menu_create("\yKonfiguracja \rHUD\w", "change_hud_handle");
1175
1176 format(menuData, charsmax(menuData), "\wKolor \yCzerwony: \r%i", codPlayer[id][PLAYER_HUD_RED]);
1177 menu_additem(menu, menuData);
1178
1179 format(menuData, charsmax(menuData), "\wKolor \yZielony: \r%i", codPlayer[id][PLAYER_HUD_GREEN]);
1180 menu_additem(menu, menuData);
1181
1182 format(menuData, charsmax(menuData), "\wKolor \yNiebieski: \r%i", codPlayer[id][PLAYER_HUD_BLUE]);
1183 menu_additem(menu, menuData);
1184
1185 format(menuData, charsmax(menuData), "\wPolozenie \yOs X: \r%i%%", codPlayer[id][PLAYER_HUD_POSX]);
1186 menu_additem(menu, menuData);
1187
1188 format(menuData, charsmax(menuData), "\wPolozenie \yOs Y: \r%i%%^n", codPlayer[id][PLAYER_HUD_POSY]);
1189 menu_additem(menu, menuData);
1190
1191 format(menuData, charsmax(menuData), "\yDomyslne \rUstawienia");
1192 menu_additem(menu, menuData);
1193
1194 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
1195
1196 menu_display(id, menu);
1197
1198 return PLUGIN_HANDLED;
1199}
1200
1201public change_hud_handle(id, menu, item)
1202{
1203 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1204
1205 if (item == MENU_EXIT) {
1206 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
1207
1208 menu_destroy(menu);
1209
1210 return PLUGIN_HANDLED;
1211 }
1212
1213 client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
1214
1215 switch (item) {
1216 case 0: if ((codPlayer[id][PLAYER_HUD_RED] += 15) > 255) codPlayer[id][PLAYER_HUD_RED] = 0;
1217 case 1: if ((codPlayer[id][PLAYER_HUD_GREEN] += 15) > 255) codPlayer[id][PLAYER_HUD_GREEN] = 0;
1218 case 2: if ((codPlayer[id][PLAYER_HUD_BLUE] += 15) > 255) codPlayer[id][PLAYER_HUD_BLUE] = 0;
1219 case 3: if ((codPlayer[id][PLAYER_HUD_POSX] += 3) > 100) codPlayer[id][PLAYER_HUD_POSX] = 0;
1220 case 4: if ((codPlayer[id][PLAYER_HUD_POSY] += 3) > 100) codPlayer[id][PLAYER_HUD_POSY] = 0;
1221 case 5: {
1222 codPlayer[id][PLAYER_HUD_RED] = 0;
1223 codPlayer[id][PLAYER_HUD_GREEN] = 255;
1224 codPlayer[id][PLAYER_HUD_BLUE] = 0;
1225 codPlayer[id][PLAYER_HUD_POSX] = 70;
1226 codPlayer[id][PLAYER_HUD_POSY] = 6;
1227 }
1228 }
1229
1230 menu_destroy(menu);
1231
1232 save_hud(id);
1233
1234 change_hud(id, 1);
1235
1236 return PLUGIN_CONTINUE;
1237}
1238
1239public save_hud(id)
1240{
1241 new tempData[256];
1242
1243 if (!get_bit(id, hudLoaded)) {
1244 formatex(tempData, charsmax(tempData), "INSERT IGNORE INTO `cod_mod` (`name`, `class`, `level`, `exp`, `intelligence`, `health`, `stamina`) VALUES (^"%s^", 'hud', '%i', '%i', '%i', '%i', '%i')",
1245 codPlayer[id][PLAYER_NAME], codPlayer[id][PLAYER_HUD_RED], codPlayer[id][PLAYER_HUD_GREEN], codPlayer[id][PLAYER_HUD_BLUE], codPlayer[id][PLAYER_HUD_POSX], codPlayer[id][PLAYER_HUD_POSY]);
1246 } else {
1247 formatex(tempData, charsmax(tempData), "UPDATE `cod_mod` SET `level` = '%i', `exp` = '%i', `intelligence` = '%i', `health` = '%i', `stamina` = '%i' WHERE `class` = 'hud' AND `name` = ^"%s^"",
1248 codPlayer[id][PLAYER_HUD_RED], codPlayer[id][PLAYER_HUD_GREEN], codPlayer[id][PLAYER_HUD_BLUE], codPlayer[id][PLAYER_HUD_POSX], codPlayer[id][PLAYER_HUD_POSY], codPlayer[id][PLAYER_NAME]);
1249 }
1250
1251 SQL_ThreadQuery(sql, "ignore_handle", tempData);
1252}
1253
1254public show_binds(id, sound)
1255{
1256 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1257
1258 if (!sound) client_cmd(id, "spk %s", codSounds[SOUND_SELECT]);
1259
1260 new menu = menu_create("\yInformacje o \rBindach\w", "show_binds_handle");
1261
1262 menu_additem(menu, "\wRakieta \y[\r+rocket\y]");
1263 menu_additem(menu, "\wMina \y[\r+mine\y]");
1264 menu_additem(menu, "\wDynamit \y[\r+dynamite\y]");
1265 menu_additem(menu, "\wBlyskawica \y[\r+thunder\y]");
1266 menu_additem(menu, "\wApteczka \y[\r+medkit\y]");
1267 menu_additem(menu, "\wTeleport \y[\r+teleport\y]");
1268 menu_additem(menu, "\wKlasa \y[\r+class\y]");
1269 menu_additem(menu, "\wPrzedmiot \y[\r+item\y]");
1270 menu_addtext(menu, "^nAby zbindowac uzycie \wumiejetnosci\y pod wybrany \wklawisz", 0);
1271 menu_addtext(menu, "\ywpisz w \wkonsoli \rbind ^"klawisz^" ^"bind^"\y, np. \rbind ^"z^" ^"+rocket^"\y.", 0);
1272 menu_addtext(menu, "\yMozesz zbindowac \wwiele \yumiejetnosci pod \wjeden klawisz\y.", 0);
1273 menu_addtext(menu, "\yWystarczy, ze wpiszesz np. \rbind ^"z^" ^"+rocket;+mine;+dynamite^"\y.", 0);
1274
1275 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
1276 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
1277 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
1278
1279 menu_display(id, menu);
1280
1281 return PLUGIN_HANDLED;
1282}
1283
1284public show_binds_handle(id, menu, item)
1285{
1286 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1287
1288 if (item == MENU_EXIT) {
1289 client_cmd(id, "spk %s", codSounds[SOUND_EXIT]);
1290
1291 menu_destroy(menu);
1292
1293 return PLUGIN_HANDLED;
1294 }
1295
1296 show_binds(id, 0);
1297
1298 menu_destroy(menu);
1299
1300 return PLUGIN_CONTINUE;
1301}
1302
1303public level_top(id)
1304{
1305 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1306
1307 new queryData[128], tempId[1];
1308
1309 tempId[0] = id;
1310
1311 formatex(queryData, charsmax(queryData), "SELECT name, class, level, exp FROM `cod_mod` ORDER BY exp DESC LIMIT 15");
1312 SQL_ThreadQuery(sql, "show_level_top", queryData, tempId, sizeof tempId);
1313
1314 return PLUGIN_HANDLED;
1315}
1316
1317public show_level_top(failState, Handle:query, error[], errorNum, tempData[], dataSize)
1318{
1319 if (failState) {
1320 if (failState == TQUERY_CONNECT_FAILED) log_to_file(LOG_FILE, "[%s] Could not connect to SQL database. Error: %s (%d)", PLUGIN, error, errorNum);
1321 else if (failState == TQUERY_QUERY_FAILED) log_to_file(LOG_FILE, "[%s] Threaded query failed. Error: %s (%d)", PLUGIN, error, errorNum);
1322
1323 return PLUGIN_HANDLED;
1324 }
1325
1326 new id = tempData[0];
1327
1328 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1329
1330 new const rankColors[][] = { "#FFCC33", "#CCFFFF", "#8B4513" };
1331
1332 static motdData[2048], name[32], class[MAX_NAME], motdLength, rank, level, exp;
1333
1334 rank = 0;
1335
1336 motdLength = format(motdData, charsmax(motdData), "<html><body bgcolor=^"#666666^"><center><table style=^"color:#FFFFFF;width:600%^">");
1337 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "<tr style=color:#000000;font-weight:bold;><td>#<td>Nick<td>Klasa<td>Poziom<td>Doswiadczenie");
1338
1339 while (SQL_MoreResults(query)) {
1340 SQL_ReadResult(query, 0, name, charsmax(name));
1341 SQL_ReadResult(query, 1, class, charsmax(class));
1342
1343 level = SQL_ReadResult(query, 2);
1344 exp = SQL_ReadResult(query, 3);
1345
1346 replace_all(name, charsmax(name), "<", "");
1347 replace_all(name, charsmax(name), ">", "");
1348
1349 if (rank < sizeof rankColors) motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "<tr style=color:%s;font-weight:bold;><td>%i.<td>%s<td>%s<td>%i<td>%i", rankColors[rank], rank + 1, name, class, level, exp);
1350 else motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "<tr><td>%i.<td>%s<td>%s<td>%i<td>%i", rank + 1, name, class, level, exp);
1351
1352 rank++;
1353
1354 SQL_NextRow(query);
1355 }
1356
1357 show_motd(id, motdData, "Top15 Poziomow");
1358
1359 return PLUGIN_HANDLED;
1360}
1361
1362public block_command()
1363 return PLUGIN_HANDLED;
1364
1365public use_rocket(id)
1366{
1367 if (!is_user_alive(id) || freezeTime || skills_blocked(id)) return PLUGIN_HANDLED;
1368
1369 if (!codPlayer[id][PLAYER_ROCKETS][ALL]) {
1370 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1371 show_dhudmessage(id, "Wykorzystales juz wszystkie rakiety!");
1372
1373 return PLUGIN_CONTINUE;
1374 }
1375
1376 if (codPlayer[id][PLAYER_LAST_ROCKET] + 3.0 > get_gametime()) {
1377 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1378 show_dhudmessage(id, "Rakiet mozesz uzywac co 3 sekundy!");
1379
1380 return PLUGIN_CONTINUE;
1381 }
1382
1383 codPlayer[id][PLAYER_LAST_ROCKET] = get_gametime();
1384 codPlayer[id][PLAYER_ROCKETS][ALL]--;
1385 codPlayer[id][PLAYER_ROCKETS][USED]++;
1386
1387 new Float:origin[3], Float:angle[3], Float:velocity[3];
1388
1389 entity_get_vector(id, EV_VEC_v_angle, angle);
1390 entity_get_vector(id, EV_VEC_origin, origin);
1391
1392 new ent = create_entity("info_target");
1393
1394 entity_set_string(ent, EV_SZ_classname, "rocket");
1395 entity_set_model(ent, codModels[MODEL_ROCKET]);
1396
1397 angle[0] *= -1.0;
1398
1399 entity_set_origin(ent, origin);
1400 entity_set_vector(ent, EV_VEC_angles, angle);
1401
1402 entity_set_int(ent, EV_INT_effects, 2);
1403 entity_set_int(ent, EV_INT_solid, SOLID_BBOX);
1404 entity_set_int(ent, EV_INT_movetype, MOVETYPE_FLY);
1405 entity_set_edict(ent, EV_ENT_owner, id);
1406
1407 get_velocity_by_aim(id, 1000, velocity);
1408
1409 entity_set_vector(ent, EV_VEC_velocity, velocity);
1410
1411 emit_sound(id, CHAN_WEAPON, codSounds[SOUND_DEPLOY], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
1412
1413 return PLUGIN_HANDLED;
1414}
1415
1416public touch_rocket(ent)
1417{
1418 if (!is_valid_ent(ent)) return;
1419
1420 make_explosion(ent, 0, 1, 190.0, 65.0, 0.5, _, ROCKET_EXPLODE);
1421
1422 remove_entity(ent);
1423}
1424
1425public use_mine(id)
1426{
1427 if (!is_user_alive(id) || freezeTime || skills_blocked(id)) return PLUGIN_CONTINUE;
1428
1429 if (!codPlayer[id][PLAYER_MINES][ALL]) {
1430 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1431 show_dhudmessage(id, "Wykorzystales juz wszystkie miny!");
1432
1433 return PLUGIN_CONTINUE;
1434 }
1435
1436 if (codPlayer[id][PLAYER_LAST_MINE] + 3.0 > get_gametime()) {
1437 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1438 show_dhudmessage(id, "Miny mozesz stawiac co 3 sekundy!");
1439
1440 return PLUGIN_CONTINUE;
1441 }
1442
1443 if (!(pev(id, pev_flags) & FL_ONGROUND)) {
1444 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1445 show_dhudmessage(id, "Musisz stac na podlozu, aby podlozyc mine!");
1446
1447 return PLUGIN_CONTINUE;
1448 }
1449
1450 if (!is_enough_space(id, 80.0)) {
1451 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1452 show_dhudmessage(id, "Nie mozesz postawic miny w przejsciu!");
1453
1454 return PLUGIN_CONTINUE;
1455 }
1456
1457 codPlayer[id][PLAYER_LAST_MINE] = get_gametime();
1458 codPlayer[id][PLAYER_MINES][ALL]--;
1459 codPlayer[id][PLAYER_MINES][USED]++;
1460
1461 new Float:origin[3], ent = create_entity("info_target")
1462
1463 entity_get_vector(id, EV_VEC_origin, origin);
1464
1465 entity_set_string(ent, EV_SZ_classname, "mine");
1466 entity_set_edict(ent, EV_ENT_owner, id);
1467 entity_set_int(ent, EV_INT_movetype, MOVETYPE_TOSS);
1468 entity_set_origin(ent, origin);
1469 entity_set_int(ent, EV_INT_solid, SOLID_BBOX);
1470
1471 entity_set_model(ent, codModels[MODEL_MINE]);
1472 entity_set_size(ent, Float:{ -16.0, -16.0, 0.0 }, Float:{ 16.0, 16.0, 2.0 });
1473
1474 drop_to_floor(ent);
1475
1476 set_rendering(ent, kRenderFxNone, 0, 0, 0, kRenderTransTexture, 50);
1477
1478 emit_sound(id, CHAN_WEAPON, codSounds[SOUND_ACTIVATE], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
1479
1480 return PLUGIN_CONTINUE;
1481}
1482
1483public touch_mine(ent, victim)
1484{
1485 if (!is_valid_ent(ent)) return;
1486
1487 new id = entity_get_edict(ent, EV_ENT_owner);
1488
1489 if (get_user_team(victim) == get_user_team(id)) return;
1490
1491 make_explosion(ent, 0, 1, 90.0, 75.0, 0.5, _, MINE_EXPLODE);
1492
1493 remove_entity(ent);
1494}
1495
1496public use_dynamite(id)
1497{
1498 if (!is_user_alive(id) || freezeTime || skills_blocked(id)) return PLUGIN_CONTINUE;
1499
1500 if (is_valid_ent(codPlayer[id][PLAYER_DYNAMITE])) {
1501 make_explosion(codPlayer[id][PLAYER_DYNAMITE], 250, 1, 250.0, 70.0, 0.5, _, DYNAMITE_EXPLODE);
1502
1503 remove_entity(codPlayer[id][PLAYER_DYNAMITE]);
1504
1505 codPlayer[id][PLAYER_DYNAMITE] = 0;
1506
1507 return PLUGIN_CONTINUE;
1508 }
1509
1510 if (!codPlayer[id][PLAYER_DYNAMITES][ALL]) {
1511 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1512 show_dhudmessage(id, "Wykorzystales juz wszystkie dynamity!");
1513
1514 return PLUGIN_CONTINUE;
1515 }
1516
1517 if (codPlayer[id][PLAYER_LAST_DYNAMITE] + 3.0 > get_gametime()) {
1518 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1519 show_dhudmessage(id, "Dynamity mozesz klasc co 3 sekundy!");
1520
1521 return PLUGIN_CONTINUE;
1522 }
1523
1524 if (!(pev(id, pev_flags) & FL_ONGROUND)) {
1525 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1526 show_dhudmessage(id, "Musisz stac na podlozu, aby postawic dynamit!");
1527
1528 return PLUGIN_CONTINUE;
1529 }
1530
1531 codPlayer[id][PLAYER_LAST_DYNAMITE] = get_gametime();
1532 codPlayer[id][PLAYER_DYNAMITES][ALL]--;
1533 codPlayer[id][PLAYER_DYNAMITES][USED]++;
1534
1535 new Float:origin[3], ent = create_entity("info_target");
1536
1537 entity_get_vector(id, EV_VEC_origin, origin);
1538
1539 codPlayer[id][PLAYER_DYNAMITE] = ent;
1540
1541 entity_set_string(ent, EV_SZ_classname, "dynamite");
1542 entity_set_edict(ent, EV_ENT_owner, id);
1543 entity_set_int(ent, EV_INT_movetype, MOVETYPE_TOSS);
1544 entity_set_origin(ent, origin);
1545 entity_set_int(ent, EV_INT_solid, SOLID_BBOX);
1546
1547 entity_set_model(ent, codModels[MODEL_DYNAMITE]);
1548 entity_set_size(ent, Float:{ -16.0, -16.0, 0.0 }, Float:{ 16.0, 16.0, 2.0 });
1549
1550 drop_to_floor(ent);
1551
1552 emit_sound(id, CHAN_WEAPON, codSounds[SOUND_ACTIVATE], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
1553
1554 return PLUGIN_CONTINUE;
1555}
1556
1557public use_medkit(id)
1558{
1559 if (!is_user_alive(id) || freezeTime || skills_blocked(id)) return PLUGIN_CONTINUE;
1560
1561 if (!codPlayer[id][PLAYER_MEDKITS][ALL]) {
1562 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1563 show_dhudmessage(id, "Wykorzystales juz wszystkie apteczki!");
1564
1565 return PLUGIN_CONTINUE;
1566 }
1567
1568 if (codPlayer[id][PLAYER_LAST_MEDKIT] + 3.0 > get_gametime()) {
1569 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1570 show_dhudmessage(id, "Apteczki mozesz klasc co 3 sekundy!");
1571
1572 return PLUGIN_CONTINUE;
1573 }
1574
1575 codPlayer[id][PLAYER_LAST_MEDKIT] = get_gametime();
1576 codPlayer[id][PLAYER_MEDKITS][ALL]--;
1577 codPlayer[id][PLAYER_MEDKITS][USED]++;
1578
1579 new Float:origin[3], ent = create_entity("info_target");
1580
1581 entity_get_vector(id, EV_VEC_origin, origin);
1582
1583 entity_set_string(ent, EV_SZ_classname, "medkit");
1584 entity_set_edict(ent, EV_ENT_owner, id);
1585 entity_set_int(ent, EV_INT_solid, SOLID_NOT);
1586 entity_set_vector(ent, EV_VEC_origin, origin);
1587 entity_set_float(ent, EV_FL_ltime, halflife_time() + 7 + 0.1);
1588
1589 entity_set_model(ent, codModels[MODEL_MEDKIT]);
1590 set_rendering(ent, kRenderFxGlowShell, 255,0,0, kRenderFxNone, 255);
1591 drop_to_floor(ent);
1592
1593 entity_set_float(ent, EV_FL_nextthink, halflife_time() + 0.1);
1594
1595 emit_sound(id, CHAN_WEAPON, codSounds[SOUND_ACTIVATE], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
1596
1597 return PLUGIN_CONTINUE;
1598}
1599
1600public think_medkit(ent)
1601{
1602 if (!is_valid_ent(ent)) return PLUGIN_CONTINUE;
1603
1604 new id = entity_get_edict(ent, EV_ENT_owner);
1605
1606 if (entity_get_edict(ent, EV_ENT_euser2) == 1) {
1607 new Float:origin[3];
1608
1609 entity_get_vector(ent, EV_VEC_origin, origin);
1610
1611 make_explosion(ent, 300, 0, 300.0, -5.0, 0.5, _, MEDKIT_HEAL);
1612
1613 entity_set_edict(ent, EV_ENT_euser2, 0);
1614 entity_set_float(ent, EV_FL_nextthink, halflife_time() + 1.5);
1615
1616 return PLUGIN_CONTINUE;
1617 }
1618
1619 if (entity_get_float(ent, EV_FL_ltime) < halflife_time() || !is_user_alive(id)) {
1620 remove_entity(ent);
1621
1622 return PLUGIN_CONTINUE;
1623 }
1624
1625 if (entity_get_float(ent, EV_FL_ltime) - 2.0 < halflife_time()) set_rendering(ent, kRenderFxNone, 255, 255, 255, kRenderTransAlpha, 100);
1626
1627 make_explosion(ent, 300, 0);
1628
1629 entity_set_edict(ent, EV_ENT_euser2, 1);
1630 entity_set_float(ent, EV_FL_nextthink, halflife_time() + 0.5);
1631
1632 return PLUGIN_CONTINUE;
1633}
1634
1635public use_thunder(id)
1636{
1637 if (!is_user_alive(id) || freezeTime || skills_blocked(id)) return PLUGIN_CONTINUE;
1638
1639 if (!codPlayer[id][PLAYER_THUNDERS][ALL]) {
1640 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1641 show_dhudmessage(id, "Wykorzystales juz wszystkie pioruny!");
1642
1643 return PLUGIN_CONTINUE;
1644 }
1645
1646 new victim, body, ret;
1647
1648 get_user_aiming(id, victim, body);
1649
1650 if (!is_user_alive(victim) || get_user_team(victim) == get_user_team(id)) return PLUGIN_CONTINUE;
1651
1652 if (codPlayer[id][PLAYER_LAST_THUNDER] + 3.0 > get_gametime()) {
1653 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1654 show_dhudmessage(id, "Piorunow mozesz uzywac co 3 sekundy!");
1655
1656 return PLUGIN_CONTINUE;
1657 }
1658
1659 codPlayer[id][PLAYER_LAST_THUNDER] = get_gametime();
1660 codPlayer[id][PLAYER_THUNDERS][ALL]--;
1661 codPlayer[id][PLAYER_THUNDERS][USED]++;
1662
1663 new ent = create_entity("info_target");
1664
1665 entity_set_string(ent, EV_SZ_classname, "thunder");
1666
1667 remove_entity(ent);
1668
1669 message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
1670 write_byte(TE_BEAMENTS);
1671 write_short(id);
1672 write_short(victim);
1673 write_short(codSprite[SPRITE_THUNDER]);
1674 write_byte(0);
1675 write_byte(10);
1676 write_byte(5);
1677 write_byte(150);
1678 write_byte(5);
1679 write_byte(200);
1680 write_byte(200);
1681 write_byte(200);
1682 write_byte(200);
1683 write_byte(10);
1684 message_end();
1685
1686 emit_sound(id, CHAN_WEAPON, codSounds[SOUND_THUNDER], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
1687 emit_sound(victim, CHAN_WEAPON, codSounds[SOUND_THUNDER], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
1688
1689 ExecuteForward(codForwards[THUNDER_REACH], ret, id, victim, 65.0 + get_intelligence(id) * 0.5);
1690
1691 if (float(ret) == COD_BLOCK) return PLUGIN_CONTINUE;
1692
1693 cod_inflict_damage(id, victim, 65.0, 0.5, DMG_CODSKILL);
1694
1695 codPlayer[id][PLAYER_LAST_THUNDER] += ret;
1696
1697 return PLUGIN_CONTINUE;
1698}
1699
1700public use_teleport(id)
1701{
1702 if (!is_user_alive(id) || freezeTime) return PLUGIN_CONTINUE;
1703
1704 if (codPlayer[id][PLAYER_TELEPORTS][ALL] == 0) {
1705 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1706 show_dhudmessage(id, "Wykorzystales juz wszystkie teleporty!");
1707
1708 return PLUGIN_CONTINUE;
1709 }
1710
1711 if (roundStart + 15.0 > get_gametime()) {
1712 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1713 show_dhudmessage(id, "Teleportowac mozesz sie po 15 sekundach od rozpoczecia rundy!");
1714
1715 return PLUGIN_CONTINUE;
1716 }
1717
1718 if (codPlayer[id][PLAYER_LAST_TELEPORT] + 15.0 > get_gametime()) {
1719 set_dhudmessage(0, 255, 210, -1.0, 0.35, 0, 0.0, 1.25, 0.0, 0.0);
1720 show_dhudmessage(id, "Teleportowac mozesz sie co 15 sekund!");
1721
1722 return PLUGIN_CONTINUE;
1723 }
1724
1725 new Float:start[3], Float:view[3], Float:end[3];
1726 pev(id, pev_origin, start);
1727
1728 pev(id, pev_view_ofs, view);
1729 xs_vec_add(start, view, start);
1730
1731 pev(id, pev_v_angle, end);
1732 engfunc(EngFunc_MakeVectors, end);
1733 global_get(glb_v_forward, end);
1734 xs_vec_mul_scalar(end, 2500.0, end);
1735 xs_vec_add(start, end, end);
1736
1737 engfunc(EngFunc_TraceLine, start, end, 0, id, 0);
1738
1739 new Float:dest[3];
1740 get_tr2(0, TR_vecEndPos, dest);
1741
1742 if (engfunc(EngFunc_PointContents, dest) == CONTENTS_SKY) return PLUGIN_HANDLED;
1743
1744 codPlayer[id][PLAYER_LAST_TELEPORT] = get_gametime();
1745
1746 if (codPlayer[id][PLAYER_TELEPORTS][ALL] != FULL) {
1747 codPlayer[id][PLAYER_TELEPORTS][ALL]--;
1748 codPlayer[id][PLAYER_TELEPORTS][USED]++;
1749 }
1750
1751 new Float:normal[3];
1752 get_tr2(0, TR_vecPlaneNormal, normal);
1753
1754 xs_vec_mul_scalar(normal, 50.0, normal);
1755 xs_vec_add(dest, normal, dest);
1756
1757 set_pev(id, pev_origin, dest);
1758
1759 check_if_player_stuck(id);
1760
1761 new ret;
1762
1763 ExecuteForward(codForwards[TELEPORT_USED], ret, id);
1764
1765 if (ret > 0) codPlayer[id][PLAYER_LAST_TELEPORT] += ret;
1766
1767 return PLUGIN_HANDLED;
1768}
1769
1770public use_item(id)
1771{
1772 if (!is_user_alive(id) || !codPlayer[id][PLAYER_ITEM] || freezeTime || skills_blocked(id)) return PLUGIN_HANDLED;
1773
1774 execute_forward_ignore_one_param(get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_SKILL_USED), id);
1775
1776 return PLUGIN_HANDLED;
1777}
1778
1779public use_class(id)
1780{
1781 if (!is_user_alive(id) || !codPlayer[id][PLAYER_CLASS] || freezeTime || skills_blocked(id)) return PLUGIN_CONTINUE;
1782
1783 execute_forward_ignore_one_param(get_class_info(codPlayer[id][PLAYER_CLASS], CLASS_SKILL_USED), id);
1784
1785 return PLUGIN_CONTINUE;
1786}
1787
1788public skills_blocked(id)
1789{
1790 if (skillsBlocked) {
1791 set_task(0.1, "show_block_info", id + TASK_BLOCK_INFO, .flags = "b");
1792
1793 return true;
1794 } else if (task_exists(id + TASK_BLOCK_INFO)) {
1795 client_print(id, print_center, "");
1796
1797 remove_task(id + TASK_BLOCK_INFO);
1798 }
1799
1800 return false;
1801}
1802
1803public show_block_info(id)
1804{
1805 id -= TASK_BLOCK_INFO;
1806
1807 new Float:currentTime = (roundStart + cvarBlockSkillsTime) - get_gametime();
1808
1809 if (currentTime <= 0.0) {
1810 client_print(id, print_center, "");
1811
1812 remove_task(id + TASK_BLOCK_INFO);
1813
1814 return;
1815 }
1816
1817 client_print(id, print_center, "Umiejetnosci zostana odblokowane za %0.1fs", currentTime);
1818}
1819
1820public player_spawn(id)
1821{
1822 if (!cod_check_account(id)) return PLUGIN_HANDLED;
1823
1824 if (codPlayer[id][PLAYER_NEW_CLASS]) set_new_class(id);
1825
1826 if (!codPlayer[id][PLAYER_CLASS]) {
1827 select_fraction(id);
1828
1829 return PLUGIN_CONTINUE;
1830 }
1831
1832 if (!codPlayer[id][PLAYER_SPAWNED]) reset_attributes(id, ROUND);
1833
1834 if (get_bit(id, resetStats)) reset_points(id);
1835
1836 if (codPlayer[id][PLAYER_POINTS] > 0) assign_points(id, 0);
1837
1838 if (codPlayer[id][PLAYER_CLASS]) execute_forward_ignore_two_params(get_class_info(codPlayer[id][PLAYER_CLASS], CLASS_SPAWNED), id, codPlayer[id][PLAYER_SPAWNED]);
1839 if (codPlayer[id][PLAYER_ITEM]) execute_forward_ignore_two_params(get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_SPAWNED), id, codPlayer[id][PLAYER_SPAWNED]);
1840
1841 execute_forward_ignore_two_params(codForwards[SPAWNED], id, codPlayer[id][PLAYER_SPAWNED]);
1842
1843 codPlayer[id][PLAYER_SPAWNED] = true;
1844
1845 set_task(0.1, "set_attributes", id);
1846
1847 return PLUGIN_CONTINUE;
1848}
1849
1850public player_take_damage_pre(victim, inflictor, attacker, Float:damage, damageBits)
1851{
1852 if (!is_user_connected(attacker) || !is_user_connected(victim) || get_user_team(attacker) == get_user_team(victim)) return HAM_IGNORED;
1853
1854 static function, weapon, hitPlace;
1855
1856 weapon = codPlayer[attacker][PLAYER_WEAPON];
1857
1858 if (!(0 < inflictor <= MAX_PLAYERS)) weapon = CSW_HEGRENADE;
1859
1860 hitPlace = get_pdata_int(victim, 75, 5);
1861
1862 if (codPlayer[victim][PLAYER_CLASS]) {
1863 damage -= damage * (get_stamina(victim) / 4.0) / 100.0;
1864
1865 function = get_class_info(codPlayer[victim][PLAYER_CLASS], CLASS_DAMAGE_VICTIM);
1866
1867 if (function != NONE) {
1868 callfunc_begin_i(function, get_class_info(codPlayer[victim][PLAYER_CLASS], CLASS_PLUGIN));
1869 callfunc_push_int(attacker);
1870 callfunc_push_int(victim);
1871 callfunc_push_int(weapon);
1872 callfunc_push_floatrf(damage);
1873 callfunc_push_int(damageBits);
1874 callfunc_push_int(hitPlace);
1875 callfunc_end();
1876
1877 if (damage == COD_BLOCK) {
1878 SetHamParamFloat(4, 0.0);
1879
1880 return HAM_SUPERCEDE;
1881 }
1882 }
1883 }
1884
1885 if (codPlayer[attacker][PLAYER_CLASS]) {
1886 damage += get_strength(attacker) / 10.0;
1887
1888 function = get_class_info(codPlayer[attacker][PLAYER_CLASS], CLASS_DAMAGE_ATTACKER);
1889
1890 if (function != NONE) {
1891 callfunc_begin_i(function, get_class_info(codPlayer[attacker][PLAYER_CLASS], CLASS_PLUGIN));
1892 callfunc_push_int(attacker);
1893 callfunc_push_int(victim);
1894 callfunc_push_int(weapon);
1895 callfunc_push_floatrf(damage);
1896 callfunc_push_int(damageBits);
1897 callfunc_push_int(hitPlace);
1898 callfunc_end();
1899
1900 if (damage == COD_BLOCK) {
1901 SetHamParamFloat(4, 0.0);
1902
1903 return HAM_SUPERCEDE;
1904 }
1905 }
1906 }
1907
1908 if (codPlayer[victim][PLAYER_ITEM]) {
1909 function = get_item_info(codPlayer[victim][PLAYER_ITEM], ITEM_DAMAGE_VICTIM);
1910
1911 if (function != NONE) {
1912 callfunc_begin_i(function, get_item_info(codPlayer[victim][PLAYER_ITEM], ITEM_PLUGIN));
1913 callfunc_push_int(attacker);
1914 callfunc_push_int(victim);
1915 callfunc_push_int(weapon);
1916 callfunc_push_floatrf(damage);
1917 callfunc_push_int(damageBits);
1918 callfunc_push_int(hitPlace);
1919 callfunc_end();
1920
1921 if (damage == COD_BLOCK) {
1922 SetHamParamFloat(4, 0.0);
1923
1924 return HAM_SUPERCEDE;
1925 }
1926 }
1927
1928 function = get_func_id("cod_item_damage_victim", get_item_info(codPlayer[victim][PLAYER_ITEM], ITEM_PLUGIN));
1929
1930 if (function != NONE) {
1931 callfunc_begin_i(function, get_item_info(codPlayer[victim][PLAYER_ITEM], ITEM_PLUGIN));
1932 callfunc_push_int(attacker);
1933 callfunc_push_int(victim);
1934 callfunc_push_int(weapon);
1935 callfunc_push_floatrf(damage);
1936 callfunc_push_int(damageBits);
1937 callfunc_push_int(hitPlace);
1938 callfunc_end();
1939
1940 if (damage == COD_BLOCK) {
1941 SetHamParamFloat(4, 0.0);
1942
1943 return HAM_SUPERCEDE;
1944 }
1945 }
1946 }
1947
1948 if (codPlayer[attacker][PLAYER_ITEM]) {
1949 function = get_item_info(codPlayer[attacker][PLAYER_ITEM], ITEM_DAMAGE_ATTACKER);
1950
1951 if (function != NONE) {
1952 callfunc_begin_i(function, get_item_info(codPlayer[attacker][PLAYER_ITEM], ITEM_PLUGIN));
1953 callfunc_push_int(attacker);
1954 callfunc_push_int(victim);
1955 callfunc_push_int(weapon);
1956 callfunc_push_floatrf(damage);
1957 callfunc_push_int(damageBits);
1958 callfunc_push_int(hitPlace);
1959 callfunc_end();
1960
1961 if (damage == COD_BLOCK) {
1962 SetHamParamFloat(4, 0.0);
1963
1964 return HAM_SUPERCEDE;
1965 }
1966 }
1967 }
1968
1969 static ret;
1970
1971 ExecuteForward(codForwards[DAMAGE_PRE], ret, attacker, victim, weapon, damage, damageBits, hitPlace);
1972
1973 if (damage <= 0.0 || float(ret) == COD_BLOCK) {
1974 SetHamParamFloat(4, 0.0);
1975
1976 return HAM_SUPERCEDE;
1977 }
1978
1979 SetHamParamFloat(4, damage);
1980
1981 return HAM_HANDLED;
1982}
1983
1984public player_take_damage_post(victim, inflictor, attacker, Float:damage, damageBits)
1985{
1986 if (!is_user_connected(attacker) || !is_user_connected(victim) || !codPlayer[attacker][PLAYER_CLASS] || get_user_team(victim) == get_user_team(attacker)) return HAM_IGNORED;
1987
1988 static ret, weapon, hitPlace;
1989
1990 weapon = codPlayer[attacker][PLAYER_WEAPON];
1991
1992 if (!(0 < inflictor <= MAX_PLAYERS)) weapon = CSW_HEGRENADE;
1993
1994 hitPlace = get_pdata_int(victim, 75, 5);
1995
1996 ExecuteForward(codForwards[DAMAGE_POST], ret, attacker, victim, weapon, damage, damageBits, hitPlace);
1997
1998 while (damage > cvarExpDamagePer) {
1999 damage -= cvarExpDamagePer;
2000
2001 codPlayer[attacker][PLAYER_GAINED_EXP] += get_exp_bonus(attacker, cvarExpDamage);
2002 }
2003
2004 check_level(attacker);
2005
2006 return HAM_IGNORED;
2007}
2008
2009public client_death(killer, victim, weaponId, hitPlace, teamKill)
2010{
2011 if (!is_user_connected(killer) || !is_user_connected(victim) || !is_user_alive(killer) || get_user_team(victim) == get_user_team(killer)) return PLUGIN_CONTINUE;
2012
2013 new playerName[MAX_NAME], className[MAX_NAME], itemName[MAX_NAME];
2014
2015 if (codPlayer[killer][PLAYER_CLASS] && get_playersnum() > cvarMinPlayers) {
2016 new exp = get_exp_bonus(killer, hitPlace == HIT_HEAD ? (cvarExpKill + cvarExpKillHS) : cvarExpKill);
2017
2018 if (codPlayer[victim][PLAYER_LEVEL] > codPlayer[killer][PLAYER_LEVEL]) exp += get_exp_bonus(killer, (codPlayer[victim][PLAYER_LEVEL] - codPlayer[killer][PLAYER_LEVEL]) * (cvarExpKill/10));
2019
2020 codPlayer[killer][PLAYER_GAINED_EXP] += exp;
2021
2022 get_user_class_info(victim, codPlayer[victim][PLAYER_CLASS], CLASS_NAME, className, charsmax(className));
2023
2024 get_user_name(victim, playerName, charsmax(playerName));
2025
2026 chat_print(killer, "Zabiles%s^x03 %s^x04 (%s - %i)^x01, dostajesz^x03 %i^x01 doswiadczenia.", hitPlace == HIT_HEAD ? " z HS" : "", playerName, className, codPlayer[victim][PLAYER_LEVEL], exp);
2027
2028 set_dhudmessage(255, 206, 85, -1.0, 0.6, 0, 0.0, 2.0, 0.0, 0.0);
2029 show_dhudmessage(killer, "+%i XP", exp);
2030
2031 codPlayer[killer][PLAYER_KS]++;
2032 codPlayer[killer][PLAYER_TIME_KS] = cvarKillStreakTime;
2033
2034 if (task_exists(killer + TASK_END_KILL_STREAK)) remove_task(killer + TASK_END_KILL_STREAK);
2035
2036 set_task(1.0, "end_kill_streak", killer + TASK_END_KILL_STREAK, _, _, "b");
2037 } else {
2038 get_user_class_info(victim, codPlayer[victim][PLAYER_CLASS], CLASS_NAME, className, charsmax(className));
2039
2040 get_user_name(victim, playerName, charsmax(playerName));
2041
2042 chat_print(killer, "Zabiles^x03 %s^x04 (%s - %i)^x01.", playerName, className, codPlayer[victim][PLAYER_LEVEL]);
2043 }
2044
2045 get_user_name(killer, playerName, charsmax(playerName));
2046
2047 get_user_class_info(killer, codPlayer[killer][PLAYER_CLASS], CLASS_NAME, className, charsmax(className));
2048
2049 if (!codPlayer[killer][PLAYER_ITEM]) {
2050 set_item(killer, RANDOM, RANDOM);
2051
2052 chat_print(victim, "Zostales zabity przez^x03 %s^x04 (%s - %i)^x01, ktoremu zostalo^x04 %i^x01 HP.", playerName, className, codPlayer[killer][PLAYER_LEVEL], get_user_health(killer));
2053 } else {
2054 get_item_info(codPlayer[killer][PLAYER_ITEM], ITEM_NAME, itemName, charsmax(itemName));
2055
2056 chat_print(victim, "Zostales zabity przez^x03 %s^x04 (%s - %i - %s)^x01, ktoremu zostalo^x04 %i^x01 HP.", playerName, className, codPlayer[killer][PLAYER_LEVEL], itemName, get_user_health(killer));
2057 }
2058
2059 check_level(killer);
2060
2061 if (codPlayer[killer][PLAYER_CLASS]) execute_forward_ignore_three_params(get_class_info(codPlayer[killer][PLAYER_CLASS], CLASS_KILL), killer, victim, hitPlace);
2062 if (codPlayer[killer][PLAYER_ITEM]) execute_forward_ignore_three_params(get_item_info(codPlayer[killer][PLAYER_ITEM], ITEM_KILL), killer, victim, hitPlace);
2063 if (codPlayer[victim][PLAYER_CLASS]) execute_forward_ignore_three_params(get_class_info(codPlayer[victim][PLAYER_CLASS], CLASS_KILLED), killer, victim, hitPlace);
2064
2065 if (codPlayer[victim][PLAYER_ITEM]) {
2066 execute_forward_ignore_three_params(get_item_info(codPlayer[victim][PLAYER_ITEM], ITEM_KILLED), killer, victim, hitPlace);
2067
2068 codPlayer[victim][PLAYER_ITEM_DURA] -= random_num(cvarMinDamageDurability, cvarMaxDamageDurability);
2069
2070 if (codPlayer[victim][PLAYER_ITEM_DURA] <= 0) {
2071 set_item(victim);
2072
2073 chat_print(victim, "Twoj przedmiot ulegl zniszczeniu.");
2074 } else chat_print(victim, "Pozostala wytrzymalosc twojego przedmiotu to^x03 %i^x01/^x03%i^x01.", codPlayer[victim][PLAYER_ITEM_DURA], cvarMaxDurability);
2075 }
2076
2077 new ret;
2078
2079 ExecuteForward(codForwards[KILLED], ret, killer, victim, weaponId, hitPlace);
2080
2081 return PLUGIN_CONTINUE;
2082}
2083
2084public touch_weapon(weapon, id)
2085{
2086 if (!is_user_connected(id)) return HAM_IGNORED;
2087
2088 new modelName[23];
2089
2090 pev(weapon, pev_model, modelName, charsmax(modelName));
2091
2092 if (containi(modelName, "w_backpack") != NONE) return HAM_IGNORED;
2093
2094 new playerTeam = get_user_team(id);
2095
2096 if (playerTeam > 2) return HAM_IGNORED;
2097
2098 pev(weapon, pev_classname, modelName, charsmax(modelName));
2099
2100 new weaponType = ((modelName[0] == 'a') ? cs_get_armoury_type(weapon): cs_get_weaponbox_type(weapon));
2101
2102 if ((1<<weaponType) & (codPlayer[id][PLAYER_WEAPONS] | codPlayer[id][PLAYER_EXTRA_WEAPONS] | allowedWeapons)) return HAM_IGNORED;
2103
2104 return HAM_SUPERCEDE;
2105}
2106
2107public speed_change(id)
2108{
2109 if (!is_user_alive(id) || freezeTime || !codPlayer[id][PLAYER_CLASS]) return HAM_IGNORED;
2110
2111 new Float:speed = floatmax(COD_FREEZE, codPlayer[id][PLAYER_SPEED][ALL] == COD_FREEZE ? COD_FREEZE : get_user_maxspeed(id) + Float:codPlayer[id][PLAYER_SPEED][ALL]);
2112
2113 set_user_maxspeed(id, speed);
2114
2115 static ret;
2116
2117 ExecuteForward(codForwards[SPEED_CHANGED], ret, id, speed);
2118
2119 return HAM_IGNORED;
2120}
2121
2122public block_buyzone()
2123 return HAM_SUPERCEDE;
2124
2125public weapon_deploy_post(ent)
2126{
2127 new id = get_pdata_cbase(ent, 41, 4);
2128
2129 if (!is_user_alive(id)) return HAM_IGNORED;
2130
2131 new ret, weapon = codPlayer[id][PLAYER_WEAPON] = cs_get_weapon_id(ent);
2132
2133 ExecuteForward(codForwards[WEAPON_DEPLOY], ret, id, weapon, ent);
2134
2135 render_change(id);
2136
2137 return HAM_IGNORED;
2138}
2139
2140public new_round()
2141{
2142 remove_ents();
2143
2144 freezeTime = true;
2145
2146 skillsBlocked = true;
2147
2148 for (new i = 1; i <= MAX_PLAYERS; i++) {
2149 if (get_bit(i, glowActive)) reset_glow(i);
2150
2151 codPlayer[i][PLAYER_SPAWNED] = false;
2152
2153 for (new j = 1; j <= MAX_PLAYERS; j++) remove_task(i + j + TASK_DAMAGE);
2154 }
2155
2156 execute_forward_ignore(codForwards[NEW_ROUND]);
2157}
2158
2159public round_start()
2160{
2161 freezeTime = false;
2162
2163 roundStart = floatround(get_gametime());
2164
2165 remove_task(TASK_BLOCK);
2166
2167 set_task(cvarBlockSkillsTime, "unblock_skills", TASK_BLOCK);
2168
2169 for (new id = 1; id <= MAX_PLAYERS; id++) {
2170 if (!is_user_alive(id)) continue;
2171
2172 display_fade(id, 1<<9, 1<<9, 1<<12, 0, 255, 70, 100);
2173
2174 client_cmd(id, "spk %s", get_user_team(id) == 1 ? codSounds[SOUND_START2] : codSounds[SOUND_START]);
2175
2176 if (cs_get_user_team(id) == CS_TEAM_CT) cs_set_user_defuse(id, 1);
2177 }
2178
2179 execute_forward_ignore(codForwards[START_ROUND]);
2180}
2181
2182public unblock_skills()
2183 skillsBlocked = false;
2184
2185public round_end()
2186{
2187 execute_forward_ignore(codForwards[END_ROUND]);
2188
2189 remove_task(TASK_BLOCK);
2190}
2191
2192public message_health(id)
2193{
2194 if (read_data(1) > 255) {
2195 message_begin(MSG_ONE, get_user_msgid("Health"), {0, 0, 0}, id);
2196 write_byte(255);
2197 message_end();
2198 }
2199}
2200
2201public cur_weapon(id)
2202{
2203 if (!is_user_alive(id)) return;
2204
2205 execute_forward_ignore_two_params(codForwards[CUR_WEAPON], id, get_user_weapon(id));
2206
2207 if (codPlayer[id][PLAYER_UNLIMITED_AMMO][ALL] && (codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][ALL] <= 0 || 1<<codPlayer[id][PLAYER_WEAPON] & codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][ALL])) set_user_clip(id);
2208}
2209
2210public t_win_round()
2211 round_winner(1);
2212
2213public ct_win_round()
2214 round_winner(2);
2215
2216public round_winner(team)
2217{
2218 if (get_playersnum() < cvarMinPlayers) return;
2219
2220 for (new id = 1; id <= MAX_PLAYERS; id++) {
2221 if (!codPlayer[id][PLAYER_CLASS] || get_user_team(id) != team) continue;
2222
2223 new exp = get_exp_bonus(id, cvarExpWinRound);
2224
2225 codPlayer[id][PLAYER_GAINED_EXP] += exp;
2226
2227 chat_print(id, "Dostales^x03 %i^x01 doswiadczenia za wygrana runde.", exp);
2228
2229 check_level(id);
2230 }
2231}
2232
2233public bomb_planted(id)
2234{
2235 if (get_playersnum() < cvarMinPlayers || !codPlayer[id][PLAYER_CLASS]) return;
2236
2237 new exp = get_exp_bonus(id, cvarExpPlant);
2238
2239 codPlayer[id][PLAYER_GAINED_EXP] += exp;
2240
2241 chat_print(id, "Dostales^x03 %i^x01 doswiadczenia za podlozenie bomby.", exp);
2242
2243 check_level(id);
2244}
2245
2246public bomb_defused(id)
2247{
2248 if (get_playersnum() < cvarMinPlayers || !codPlayer[id][PLAYER_CLASS]) return;
2249
2250 new exp = get_exp_bonus(id, cvarExpDefuse);
2251
2252 codPlayer[id][PLAYER_GAINED_EXP] += exp;
2253
2254 chat_print(id, "Dostales^x03 %i^x01 doswiadczenia za rozbrojenie bomby.", exp);
2255
2256 check_level(id);
2257}
2258
2259public hostages_rescued()
2260{
2261 if (get_playersnum() < cvarMinPlayers) return;
2262
2263 new id = get_loguser_index(), exp = get_exp_bonus(id, cvarExpRescue);
2264
2265 if (!codPlayer[id][PLAYER_CLASS]) return;
2266
2267 codPlayer[id][PLAYER_GAINED_EXP] += exp;
2268
2269 chat_print(id, "Dostales^x03 %i^x01 doswiadczenia za uratowanie zakladnikow.", exp);
2270
2271 check_level(id);
2272}
2273
2274stock render_change(id, playerStatus = NONE)
2275{
2276 if (!is_user_alive(id) || codPlayer[id][PLAYER_STATUS] == playerStatus || get_bit(id, renderTimer) || get_bit(id, glowActive)) return;
2277
2278 if (playerStatus != NONE) codPlayer[id][PLAYER_STATUS] = playerStatus;
2279
2280 static renderAmount, oldRenderAmount[MAX_PLAYERS + 1];
2281
2282 renderAmount = render_count(id);
2283
2284 if (renderAmount != oldRenderAmount[id]) {
2285 set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, renderAmount);
2286
2287 execute_forward_ignore_two_params(codForwards[RENDER_CHANGED], id, renderAmount);
2288
2289 oldRenderAmount[id] = renderAmount;
2290 }
2291}
2292
2293stock render_count(id, type = NONE)
2294{
2295 new render = 255, codRender[renderInfo];
2296
2297 if (get_bit(id, glowActive)) return render;
2298
2299 if (type == NONE) {
2300 for (new i = CLASS; i <= ADDITIONAL; i++) {
2301 ArrayGetArray(codPlayerRender[id], i, codRender);
2302
2303 if (codRender[RENDER_VALUE] < 256 && (codPlayer[id][PLAYER_STATUS] & codRender[RENDER_STATUS]) && (codRender[RENDER_WEAPON] <= 0 || (1<<codPlayer[id][PLAYER_WEAPON] & codRender[RENDER_WEAPON])))
2304 render = codRender[RENDER_VALUE] < 0 ? (render - codRender[RENDER_VALUE]) : (codRender[RENDER_VALUE] < render ? codRender[RENDER_VALUE] : render);
2305 }
2306
2307 for (new i = ROUND; i < ArraySize(codPlayerRender[id]); i++) {
2308 ArrayGetArray(codPlayerRender[id], i, codRender);
2309
2310 if (codPlayer[id][PLAYER_STATUS] & codRender[RENDER_STATUS] && (codRender[RENDER_WEAPON] <= 0 || (1<<codPlayer[id][PLAYER_WEAPON] & codRender[RENDER_WEAPON])))
2311 render = codRender[RENDER_VALUE] < 0 ? (render - codRender[RENDER_VALUE]) : (codRender[RENDER_VALUE] < render ? codRender[RENDER_VALUE] : render);
2312 }
2313 } else {
2314 for (new i = 0; i < ArraySize(codPlayerRender[id]); i++) {
2315 ArrayGetArray(codPlayerRender[id], i, codRender);
2316
2317 if (type != ALL && type != codRender[RENDER_TYPE]) continue;
2318
2319 if (codRender[RENDER_VALUE] < 256 && codPlayer[id][PLAYER_STATUS] & codRender[RENDER_STATUS] && (codRender[RENDER_WEAPON] <= 0 || (1<<codPlayer[id][PLAYER_WEAPON] & codRender[RENDER_WEAPON])))
2320 render = codRender[RENDER_VALUE] < 0 ? (render - codRender[RENDER_VALUE]) : (codRender[RENDER_VALUE] < render ? codRender[RENDER_VALUE] : render);
2321 }
2322 }
2323
2324 return max(0, render);
2325}
2326
2327public cmd_start(id, ucHandle)
2328{
2329 if (!is_user_alive(id) || freezeTime) return FMRES_IGNORED;
2330
2331 static Float:velocity[3], Float:speed, button, oldButton, playerState, ret;
2332
2333 button = get_uc(ucHandle, UC_Buttons);
2334 oldButton = pev(id, pev_oldbuttons);
2335 playerState = RENDER_ALWAYS;
2336
2337 pev(id, pev_velocity, velocity);
2338
2339 speed = vector_length(velocity);
2340
2341 if (get_user_maxspeed(id) > speed * 1.8) set_pev(id, pev_flTimeStepSound, 300);
2342
2343 if (codPlayer[id][PLAYER_REDUCER][ALL] && (codPlayer[id][PLAYER_REDUCER_WEAPONS][ALL] <= 0 || 1<<codPlayer[id][PLAYER_WEAPON] & codPlayer[id][PLAYER_REDUCER_WEAPONS][ALL]) && button & IN_ATTACK)
2344 {
2345 new Float:punchAngle[3];
2346
2347 pev(id, pev_punchangle, punchAngle);
2348
2349 for (new i = 0; i < 3; i++) punchAngle[i] *= 0.9;
2350
2351 set_pev(id, pev_punchangle, punchAngle);
2352 }
2353
2354 if (speed == 0.0) playerState |= RENDER_STAND;
2355 else playerState |= RENDER_MOVE;
2356
2357 if (button & IN_DUCK) playerState |= RENDER_DUCK;
2358
2359 if (pev(id, pev_gaitsequence) == 3) playerState |= RENDER_SHIFT;
2360
2361 ExecuteForward(codForwards[CMD_START], ret, id, button, oldButton, playerState);
2362
2363 render_change(id, playerState);
2364
2365 if (!codPlayer[id][PLAYER_JUMPS][ALL]) return FMRES_IGNORED;
2366
2367 new flags = pev(id, pev_flags);
2368
2369 if ((button & IN_JUMP) && !(flags & FL_ONGROUND) && !(oldButton & IN_JUMP) && codPlayer[id][PLAYER_LEFT_JUMPS]) {
2370 codPlayer[id][PLAYER_LEFT_JUMPS]--;
2371
2372 pev(id, pev_velocity, velocity);
2373
2374 velocity[2] = random_float(265.0, 285.0);
2375
2376 set_pev(id, pev_velocity, velocity);
2377 } else if (flags & FL_ONGROUND) codPlayer[id][PLAYER_LEFT_JUMPS] = codPlayer[id][PLAYER_JUMPS][ALL];
2378
2379 return FMRES_IGNORED;
2380}
2381
2382public sound_emit(id, channel, sound[], Float:volume, Float:attn, flags, pitch)
2383{
2384 if (!is_user_alive(id) || !codPlayer[id][PLAYER_CLASS]) return FMRES_IGNORED;
2385
2386 if (equal(sound, "common/wpn_denyselect.wav")) {
2387 use_class(id);
2388
2389 return FMRES_SUPERCEDE;
2390 }
2391
2392 if (equal(sound, "items/ammopickup2.wav")) {
2393 cs_set_user_armor(id, 0, CS_ARMOR_NONE);
2394
2395 return FMRES_SUPERCEDE;
2396 }
2397
2398 if (equal(sound, "items/equip_nvg.wav")) {
2399 cs_set_user_nvg(id, 0);
2400
2401 return FMRES_SUPERCEDE;
2402 }
2403
2404 return FMRES_IGNORED;
2405}
2406
2407public player_prethink(id)
2408{
2409 if (!is_user_alive(id)) return FMRES_IGNORED;
2410
2411 execute_forward_ignore_one_param(codForwards[PRETHINK], id);
2412
2413 if (codPlayer[id][PLAYER_ELIMINATOR][ALL] && (codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][ALL] <= 0 || 1<<codPlayer[id][PLAYER_WEAPON] & codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][ALL])) set_pev(id, pev_punchangle, {0.0, 0.0, 0.0});
2414
2415 if (!codPlayer[id][PLAYER_BUNNYHOP][ALL]) return FMRES_IGNORED;
2416
2417 entity_set_float(id, EV_FL_fuser2, 0.0);
2418
2419 if (entity_get_int(id, EV_INT_button) & 2) {
2420 new flags = entity_get_int(id , EV_INT_flags);
2421
2422 if (flags & FL_WATERJUMP || entity_get_int(id, EV_INT_waterlevel) >= 2 || !(flags & FL_ONGROUND)) return FMRES_IGNORED;
2423
2424 new Float:velocity[3];
2425
2426 entity_get_vector(id, EV_VEC_velocity, velocity);
2427
2428 velocity[2] += 250.0;
2429
2430 entity_set_vector(id, EV_VEC_velocity, velocity);
2431
2432 entity_set_int(id, EV_INT_gaitsequence, 6);
2433 }
2434
2435 return FMRES_IGNORED;
2436}
2437
2438public update_client_data(id, sendWeapons, cdHandle)
2439 if (codPlayer[id][PLAYER_ELIMINATOR][ALL] && (codPlayer[id][PLAYER_ELIMINATOR][ALL] && codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][ALL] & codPlayer[id][PLAYER_WEAPON])) set_cd(cdHandle, CD_PunchAngle, {0.0, 0.0, 0.0});
2440
2441public say_text(msgId, msgDest, msgEnt)
2442{
2443 new id = get_msg_arg_int(1);
2444
2445 if (is_user_connected(id) && codPlayer[id][PLAYER_CLASS]) {
2446 new tempMessage[192], message[192], chatPrefix[64], playerName[32];
2447
2448 get_msg_arg_string(2, tempMessage, charsmax(tempMessage));
2449
2450 get_user_class_info(id, codPlayer[id][PLAYER_CLASS], CLASS_NAME, chatPrefix, charsmax(chatPrefix));
2451
2452 format(chatPrefix, charsmax(chatPrefix), "^x04[%s - %i]", chatPrefix, codPlayer[id][PLAYER_LEVEL]);
2453
2454 if (!equal(tempMessage, "#Cstrike_Chat_All")) {
2455 add(message, charsmax(message), chatPrefix);
2456 add(message, charsmax(message), " ");
2457 add(message, charsmax(message), tempMessage);
2458 } else {
2459 get_user_name(id, playerName, charsmax(playerName));
2460
2461 get_msg_arg_string(4, tempMessage, charsmax(tempMessage));
2462 set_msg_arg_string(4, "");
2463
2464 add(message, charsmax(message), chatPrefix);
2465 add(message, charsmax(message), "^x03 ");
2466 add(message, charsmax(message), playerName);
2467 add(message, charsmax(message), "^x01 : ");
2468 add(message, charsmax(message), tempMessage);
2469 }
2470
2471 set_msg_arg_string(2, message);
2472 }
2473
2474 return PLUGIN_CONTINUE;
2475}
2476
2477public message_ammo(msgId, msgDest, id)
2478{
2479 new weapon = get_user_weapon(id);
2480
2481 if (weapon && weapon != CSW_KNIFE && weapon != CSW_C4 && weapon != CSW_HEGRENADE && weapon != CSW_FLASHBANG && weapon != CSW_SMOKEGRENADE) cs_set_user_bpammo(id, weapon, maxBpAmmo[weapon]);
2482}
2483
2484public message_intermission()
2485{
2486 mapChange = true;
2487
2488 execute_forward_ignore(codForwards[END_MAP]);
2489
2490 set_task(1.0, "save_players");
2491}
2492
2493public save_players()
2494{
2495 for (new id = 1; id <= MAX_PLAYERS; id++) {
2496 if (!is_user_connected(id) || is_user_hltv(id) || is_user_bot(id)) continue;
2497
2498 save_data(id, FINAL);
2499 }
2500
2501 return PLUGIN_CONTINUE;
2502}
2503
2504public show_info(id)
2505{
2506 id -= TASK_SHOW_INFO;
2507
2508 if (!is_user_connected(id) || is_user_hltv(id) || is_user_bot(id)) {
2509 remove_task(id + TASK_SHOW_INFO);
2510
2511 return PLUGIN_CONTINUE;
2512 }
2513
2514 static hudData[512], className[MAX_NAME], itemName[MAX_NAME], clanName[MAX_NAME], missionProgress[MAX_NAME], gameTime[MAX_NAME], Float:levelPercent, exp, target;
2515
2516 clanName = ""; missionProgress = "";
2517
2518 target = id;
2519
2520 if (!is_user_alive(id)) {
2521 target = pev(id, pev_iuser2);
2522
2523 set_hudmessage(255, 255, 255, 0.6, -1.0, 0, 0.0, 0.3, 0.0, 0.0, 4);
2524 } else set_hudmessage(codPlayer[id][PLAYER_HUD_RED], codPlayer[id][PLAYER_HUD_GREEN], codPlayer[id][PLAYER_HUD_BLUE], float(codPlayer[id][PLAYER_HUD_POSX]) / 100.0, float(codPlayer[id][PLAYER_HUD_POSY]) / 100.0, 0, 0.0, 0.3, 0.0, 0.0, 4);
2525
2526 if (!target) return PLUGIN_CONTINUE;
2527
2528 get_user_class_info(target, codPlayer[target][PLAYER_CLASS], CLASS_NAME, className, charsmax(className));
2529 get_item_info(codPlayer[target][PLAYER_ITEM], ITEM_NAME, itemName, charsmax(itemName));
2530
2531 if (cod_get_user_clan(target)) {
2532 cod_get_clan_name(cod_get_user_clan(target), clanName, charsmax(clanName));
2533
2534 format(clanName, charsmax(clanName), "^n[Klan : %s]", clanName);
2535 }
2536
2537 if (cod_get_user_mission(target) > NONE) formatex(missionProgress, charsmax(missionProgress), "^n[Misja : %i/%i (%0.1f%s)]",
2538 cod_get_user_mission_progress(target), cod_get_user_mission_need(target), float(cod_get_user_mission_progress(target)) / float(cod_get_user_mission_need(target)) * 100.0, "%%");
2539
2540 cod_get_user_time_text(target, gameTime, charsmax(gameTime));
2541
2542 exp = codPlayer[target][PLAYER_LEVEL] - 1 >= 0 ? get_level_exp(codPlayer[target][PLAYER_LEVEL] - 1) : 0;
2543 levelPercent = codPlayer[target][PLAYER_LEVEL] < cvarLevelLimit ? (float((codPlayer[target][PLAYER_EXP] - exp)) / float((get_level_exp(codPlayer[target][PLAYER_LEVEL]) - exp))) * 100.0 : 0.0;
2544
2545 formatex(hudData, charsmax(hudData), "[Klasa : %s]%s^n[Poziom : %i]^n[Doswiadczenie : %0.1f%s]^n[Przedmiot : %s (%i/%i)]%s^n[Zycie : %i]^n[NightCoin(s) : %i]^n[Czas Gry : %s]",
2546 className, clanName, codPlayer[target][PLAYER_LEVEL], levelPercent, "%%", itemName, codPlayer[target][PLAYER_ITEM_DURA], cvarMaxDurability, missionProgress, get_user_health(target), cod_get_user_honor(target), gameTime);
2547
2548 if (get_exp_bonus(target, NONE)) format(hudData, charsmax(hudData), "%s^n[Exp Bonus : %i%s]", hudData, get_exp_bonus(target, NONE), "%%");
2549
2550 if (codPlayer[target][PLAYER_KS]) format(hudData, charsmax(hudData), "%s^n[KillStreak : %i (%i s)]", hudData, codPlayer[target][PLAYER_KS], codPlayer[target][PLAYER_TIME_KS]);
2551
2552 ShowSyncHudMsg(id, hudInfo, hudData);
2553
2554 return PLUGIN_CONTINUE;
2555}
2556
2557public show_advertisement(id)
2558{
2559 id -= TASK_SHOW_AD;
2560
2561 chat_print(id, "W celu uzyskania informacji o komendach wpisz^x03 /menu^x01 (klawisz^x03 ^"v^"^x01).");
2562}
2563
2564public show_help(id)
2565{
2566 id -= TASK_SHOW_HELP;
2567
2568 set_dhudmessage(0, 255, 0, -1.0, 0.7, 0, 5.0, 5.0, 0.1, 0.5);
2569
2570 switch (random_num(1, 17)) {
2571 case 1: show_dhudmessage(id, "Aby uzyc umiejetnosci klasy wcisnij klawisz E. Przedmiotow uzywa sie klawiszem F.");
2572 case 2: show_dhudmessage(id, "Chcialbys zalozyc klan lub do niego dolaczyc? Wpisz komende /klan.");
2573 case 3: show_dhudmessage(id, "Sposobem na zdobywanie wiekszej ilosci doswiadczenia sa /misje.");
2574 case 5: show_dhudmessage(id, "Sprzedaj niechciany przedmiot zamiast go wyrzucac. Zajrzyj na /rynek.");
2575 case 6: show_dhudmessage(id, "Mozesz dowolnie konfigurowac wyswietlanie HUD uzywajac komendy /hud.");
2576 case 11: show_dhudmessage(id, "Jesli chcesz przelac komus NightCoin(s) uzyj komendy /przelew.");
2577 case 12: show_dhudmessage(id, "Oddaj przedmiot komenda /daj lub uzyj /wymien do wymiany z innym graczem.");
2578 case 13: show_dhudmessage(id, "Aby zarzadzac swoim kontem - w tym zmienic haslo, wpisz komende /konto.");
2579 case 14: show_dhudmessage(id, "Glowne menu serwera znajdziesz pod komenda /menu lub klawiszem V.");
2580 case 15: show_dhudmessage(id, "Jesli chcesz kupic VIPa, klasy premium, exp lub NightCoin(s) zajrzyj do /sklepsms.");
2581 case 16: show_dhudmessage(id, "Jest wiele dodatkowych statystyk, ktore znajdziesz pod komenda /statymenu.");
2582 case 17: {
2583 static info[128];
2584
2585 formatex(info, charsmax(info), "Doswiadczenie i misje sa naliczane, jesli na serwerze gra co najmniej %i graczy.", cvarMinPlayers);
2586
2587 show_dhudmessage(id, info);
2588 }
2589 }
2590}
2591
2592public check_time()
2593{
2594 static time[3], hour;
2595
2596 get_time("%H", time, charsmax(time));
2597
2598 hour = str_to_num(time);
2599
2600 if ((cvarNightExpFrom > cvarNightExpTo && (hour >= cvarNightExpFrom || hour < cvarNightExpTo)) || (hour >= cvarNightExpFrom && hour < cvarNightExpTo)) nightExp = true;
2601 else nightExp = false;
2602}
2603
2604public night_exp_info()
2605{
2606 if (nightExp) chat_print(0, "Na serwerze wlaczony jest nocny^x03 EXP x 2^x01!");
2607 else chat_print(0, "Od godziny^x03 %i:00^x01 do^x03 %i:00^x01 na serwerze jest^x03 EXP x 2^x01!", cvarNightExpFrom, cvarNightExpTo);
2608}
2609
2610public set_speed_limit(id)
2611{
2612 id -= TASK_SPEED_LIMIT;
2613
2614 cmd_execute(id, "cl_forwardspeed 450");
2615 cmd_execute(id, "cl_backspeed 450");
2616 cmd_execute(id, "cl_sidespeed 450");
2617 cmd_execute(id, "^"cl_forwardspeed^" 450");
2618 cmd_execute(id, "^"cl_backspeed^" 450");
2619 cmd_execute(id, "^"cl_sidespeed^" 450");
2620 cmd_execute(id, "echo ^"^";^"cl_forwardspeed^" 450");
2621 cmd_execute(id, "echo ^"^";^"cl_backspeed^" 450");
2622 cmd_execute(id, "echo ^"^";^"cl_sidespeed^" 450");
2623}
2624
2625public set_new_class(id)
2626{
2627 if (!is_user_connected(id)) return PLUGIN_CONTINUE;
2628
2629 new ret, class = codPlayer[id][PLAYER_CLASS];
2630
2631 if (codPlayer[id][PLAYER_CLASS]) {
2632 save_data(id, NORMAL);
2633
2634 execute_forward_ignore_one_param(get_class_info(codPlayer[id][PLAYER_CLASS], CLASS_DISABLED), id);
2635
2636 reset_attributes(id, CLASS);
2637 }
2638
2639 load_class(id, codPlayer[id][PLAYER_NEW_CLASS]);
2640
2641 ExecuteForward(get_class_info(codPlayer[id][PLAYER_NEW_CLASS], CLASS_ENABLED), ret, id, codPlayer[id][PLAYER_PROMOTION]);
2642
2643 if (ret == COD_STOP) {
2644 codPlayer[id][PLAYER_NEW_CLASS] = 0;
2645
2646 load_class(id, codPlayer[id][class]);
2647
2648 select_fraction(id);
2649
2650 return PLUGIN_CONTINUE;
2651 }
2652
2653 codPlayer[id][PLAYER_CLASS] = codPlayer[id][PLAYER_NEW_CLASS];
2654 codPlayer[id][PLAYER_NEW_CLASS] = 0;
2655
2656 execute_forward_ignore_two_params(codForwards[CLASS_CHANGED], id, codPlayer[id][PLAYER_CLASS]);
2657
2658 if (codPlayer[id][PLAYER_POINTS] > 0) assign_points(id, 0);
2659
2660 check_level(id);
2661
2662 set_task(0.1, "set_attributes", id);
2663
2664 return PLUGIN_CONTINUE;
2665}
2666
2667stock set_item(id, item = 0, value = 0)
2668{
2669 if (!ArraySize(codItems) || !is_user_connected(id)) return PLUGIN_CONTINUE;
2670
2671 reset_attributes(id, ITEM);
2672
2673 item = (item == RANDOM) ? random_num(1, ArraySize(codItems) - 1): item;
2674
2675 new ret;
2676
2677 if (item) {
2678 if (value == RANDOM) {
2679 new valueMin = get_item_info(item, ITEM_RANDOM_MIN), valueMax = get_item_info(item, ITEM_RANDOM_MAX);
2680
2681 if (valueMax) value = random_num(valueMin, valueMax);
2682 else if (valueMin) value = valueMin;
2683 }
2684
2685 ExecuteForward(get_item_info(item, ITEM_GIVE), ret, id, value);
2686 }
2687
2688 if (ret == COD_STOP) {
2689 set_item(id, RANDOM, RANDOM);
2690
2691 return COD_STOP;
2692 }
2693
2694 if (codPlayer[id][PLAYER_ITEM]) execute_forward_ignore_one_param(get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_DROP), id);
2695
2696 codPlayer[id][PLAYER_ITEM] = item;
2697
2698 execute_forward_ignore_two_params(codForwards[ITEM_CHANGED], id, codPlayer[id][PLAYER_ITEM]);
2699
2700 if (codPlayer[id][PLAYER_ITEM]) {
2701 codPlayer[id][PLAYER_ITEM_DURA] = cvarMaxDurability;
2702
2703 new itemDescription[MAX_DESC], itemName[MAX_NAME], itemValue[6], itemTempValue = _cod_get_user_item_value(id);
2704
2705 get_item_info(item, ITEM_DESC, itemDescription, charsmax(itemDescription));
2706 get_item_info(item, ITEM_NAME, itemName, charsmax(itemName));
2707
2708 if (itemTempValue != NONE) {
2709 num_to_str(itemTempValue, itemValue, charsmax(itemValue));
2710
2711 format(itemDescription, charsmax(itemDescription), itemDescription, itemValue);
2712 }
2713
2714 chat_print(id, "Zdobyles^x03 %s^x01 -^x04 %s^x01.", itemName, itemDescription);
2715 } else codPlayer[id][PLAYER_ITEM_DURA] = 0;
2716
2717 return PLUGIN_CONTINUE;
2718}
2719
2720public check_level(id)
2721{
2722 if (!is_user_connected(id) || !codPlayer[id][PLAYER_CLASS]) return;
2723
2724 while ((codPlayer[id][PLAYER_GAINED_EXP] + codPlayer[id][PLAYER_EXP]) >= get_level_exp(codPlayer[id][PLAYER_LEVEL] + codPlayer[id][PLAYER_GAINED_LEVEL]) && codPlayer[id][PLAYER_LEVEL] + codPlayer[id][PLAYER_GAINED_LEVEL] < cvarLevelLimit) codPlayer[id][PLAYER_GAINED_LEVEL]++;
2725
2726 if (!codPlayer[id][PLAYER_GAINED_LEVEL]) while ((codPlayer[id][PLAYER_GAINED_EXP] + codPlayer[id][PLAYER_EXP]) < get_level_exp(codPlayer[id][PLAYER_LEVEL] + codPlayer[id][PLAYER_GAINED_LEVEL] - 1)) codPlayer[id][PLAYER_GAINED_LEVEL]--;
2727
2728 if (codPlayer[id][PLAYER_GAINED_LEVEL]) {
2729 codPlayer[id][PLAYER_POINTS] = (codPlayer[id][PLAYER_LEVEL] + codPlayer[id][PLAYER_GAINED_LEVEL] - 1) - codPlayer[id][PLAYER_INT] - codPlayer[id][PLAYER_HEAL] - codPlayer[id][PLAYER_STAM] - codPlayer[id][PLAYER_STR] - codPlayer[id][PLAYER_COND];
2730
2731 set_dhudmessage(212, 255, 85, -1.0, 0.24, 0, 0.0, 2.5, 0.0, 0.0);
2732 show_dhudmessage(id, "Awansowales do %i poziomu!", codPlayer[id][PLAYER_LEVEL] + codPlayer[id][PLAYER_GAINED_LEVEL]);
2733
2734 check_promotion(id, 1);
2735
2736 switch (random_num(1, 3)) {
2737 case 1: client_cmd(id, "spk %s", codSounds[SOUND_LVLUP]);
2738 case 2: client_cmd(id, "spk %s", codSounds[SOUND_LVLUP2]);
2739 case 3: client_cmd(id, "spk %s", codSounds[SOUND_LVLUP3]);
2740 }
2741 }
2742
2743 if (codPlayer[id][PLAYER_GAINED_LEVEL] < 0) {
2744 reset_points(id);
2745
2746 set_dhudmessage(212, 255, 85, -1.0, 0.24, 0, 0.0, 2.5, 0.0, 0.0);
2747 show_dhudmessage(id, "Spadles do %i poziomu!", codPlayer[id][PLAYER_LEVEL] + codPlayer[id][PLAYER_GAINED_LEVEL]);
2748 }
2749
2750 save_data(id, NORMAL);
2751}
2752
2753public reset_attributes(id, type)
2754{
2755 codPlayer[id][PLAYER_ROCKETS][type] = 0;
2756 codPlayer[id][PLAYER_MINES][type] = 0;
2757 codPlayer[id][PLAYER_DYNAMITES][type] = 0;
2758 codPlayer[id][PLAYER_THUNDERS][type] = 0;
2759 codPlayer[id][PLAYER_MEDKITS][type] = 0;
2760 codPlayer[id][PLAYER_JUMPS][type] = 0;
2761 codPlayer[id][PLAYER_RESISTANCE][type] = 0;
2762 codPlayer[id][PLAYER_BUNNYHOP][type] = 0;
2763 codPlayer[id][PLAYER_NOCLIP][type] = 0;
2764 codPlayer[id][PLAYER_GODMODE][type] = 0;
2765 codPlayer[id][PLAYER_FOOTSTEPS][type] = 0;
2766 codPlayer[id][PLAYER_MODEL][type] = 0;
2767 codPlayer[id][PLAYER_UNLIMITED_AMMO][type] = 0;
2768 codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][type] = 0;
2769 codPlayer[id][PLAYER_ELIMINATOR][type] = 0;
2770 codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][type] = 0;
2771 codPlayer[id][PLAYER_REDUCER][type] = 0;
2772 codPlayer[id][PLAYER_REDUCER_WEAPONS][type] = 0;
2773 codPlayer[id][PLAYER_TELEPORTS][type] = 0;
2774
2775 codPlayer[id][PLAYER_GRAVITY][type] = _:1.0;
2776 codPlayer[id][PLAYER_SPEED][type] = _:0.0;
2777
2778 remove_render_type(id, type);
2779
2780 model_change(id);
2781
2782 set_gravity(id);
2783
2784 speed_change(id);
2785
2786 if (type != ITEM) {
2787 codPlayer[id][PLAYER_ROCKETS][USED] = 0;
2788 codPlayer[id][PLAYER_MINES][USED] = 0;
2789 codPlayer[id][PLAYER_DYNAMITES][USED] = 0;
2790 codPlayer[id][PLAYER_THUNDERS][USED] = 0;
2791 codPlayer[id][PLAYER_MEDKITS][USED] = 0;
2792 codPlayer[id][PLAYER_TELEPORTS][USED] = 0;
2793
2794 if (task_exists(id + TASK_END_KILL_STREAK)) remove_task(id + TASK_END_KILL_STREAK);
2795
2796 for (new i = PLAYER_LAST_ROCKET; i <= PLAYER_LAST_TELEPORT; i++) codPlayer[id][i] = _:0.0;
2797
2798 codPlayer[id][PLAYER_LEFT_JUMPS] = 0;
2799 codPlayer[id][PLAYER_KS] = 0;
2800 codPlayer[id][PLAYER_TIME_KS] = 0;
2801 } else {
2802 calculate_rockets_left(id);
2803 calculate_mines_left(id);
2804 calculate_dynamites_left(id);
2805 calculate_thunders_left(id);
2806 calculate_medkits_left(id);
2807 calculate_teleports_left(id);
2808 }
2809
2810 codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][ALL] = 0;
2811 codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][ALL] = 0;
2812 codPlayer[id][PLAYER_REDUCER_WEAPONS][ALL] = 0;
2813 codPlayer[id][PLAYER_FOOTSTEPS][ALL] = 0;
2814 codPlayer[id][PLAYER_BUNNYHOP][ALL] = 0;
2815 codPlayer[id][PLAYER_RESISTANCE][ALL] = 0;
2816 codPlayer[id][PLAYER_NOCLIP][ALL] = 0;
2817 codPlayer[id][PLAYER_GODMODE][ALL] = 0;
2818 codPlayer[id][PLAYER_MODEL][ALL] = 0;
2819 codPlayer[id][PLAYER_UNLIMITED_AMMO][ALL] = 0;
2820 codPlayer[id][PLAYER_ELIMINATOR][ALL] = 0;
2821 codPlayer[id][PLAYER_REDUCER][ALL] = 0;
2822 codPlayer[id][PLAYER_JUMPS][ALL] = 0;
2823
2824 new unlimitedWeapons, eliminatorWeapons, reductorWeapons, jumps;
2825
2826 for (new i = CLASS; i <= ROUND; i++) {
2827 if (codPlayer[id][PLAYER_FOOTSTEPS][i]) codPlayer[id][PLAYER_FOOTSTEPS][ALL] = true;
2828 if (codPlayer[id][PLAYER_BUNNYHOP][i]) codPlayer[id][PLAYER_BUNNYHOP][ALL] = true;
2829 if (codPlayer[id][PLAYER_RESISTANCE][i]) codPlayer[id][PLAYER_RESISTANCE][ALL] = true;
2830 if (codPlayer[id][PLAYER_NOCLIP][i]) codPlayer[id][PLAYER_NOCLIP][ALL] = true;
2831 if (codPlayer[id][PLAYER_GODMODE][i]) codPlayer[id][PLAYER_GODMODE][ALL] = true;
2832 if (codPlayer[id][PLAYER_MODEL][i]) codPlayer[id][PLAYER_MODEL][ALL] = true;
2833 if (codPlayer[id][PLAYER_UNLIMITED_AMMO][i]) codPlayer[id][PLAYER_UNLIMITED_AMMO][ALL] = true;
2834 if (codPlayer[id][PLAYER_ELIMINATOR][i]) codPlayer[id][PLAYER_ELIMINATOR][ALL] = true;
2835 if (codPlayer[id][PLAYER_REDUCER][i]) codPlayer[id][PLAYER_REDUCER][ALL] = true;
2836 if (codPlayer[id][PLAYER_JUMPS][i]) {
2837 codPlayer[id][PLAYER_JUMPS][ALL] = true;
2838
2839 jumps += codPlayer[id][PLAYER_JUMPS][i];
2840 }
2841
2842 if (codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][i] == FULL) unlimitedWeapons = FULL;
2843 else if (codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][i]) unlimitedWeapons == FULL ? (unlimitedWeapons = FULL) : (unlimitedWeapons |= codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][i]);
2844
2845 if (codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][i] == FULL) eliminatorWeapons = FULL;
2846 else if (codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][i]) eliminatorWeapons == FULL ? (eliminatorWeapons = FULL) : (eliminatorWeapons |= codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][i]);
2847
2848 if (codPlayer[id][PLAYER_REDUCER_WEAPONS][i] == FULL) reductorWeapons = FULL;
2849 else if (codPlayer[id][PLAYER_REDUCER_WEAPONS][i]) reductorWeapons == FULL ? (reductorWeapons = FULL) : (reductorWeapons |= codPlayer[id][PLAYER_REDUCER_WEAPONS][i]);
2850 }
2851
2852 codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][ALL] = unlimitedWeapons
2853 codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][ALL] = eliminatorWeapons;
2854 codPlayer[id][PLAYER_REDUCER_WEAPONS][ALL] = reductorWeapons;
2855
2856 codPlayer[id][PLAYER_LEFT_JUMPS] = jumps;
2857
2858 set_user_footsteps(id, codPlayer[id][PLAYER_FOOTSTEPS][ALL]);
2859 set_user_noclip(id, codPlayer[id][PLAYER_NOCLIP][ALL]);
2860 set_user_godmode(id, codPlayer[id][PLAYER_GODMODE][ALL]);
2861}
2862
2863public set_attributes(id)
2864{
2865 if (!is_user_alive(id)) return;
2866
2867 set_user_health(id, get_health(id));
2868
2869 set_user_footsteps(id, codPlayer[id][PLAYER_FOOTSTEPS][ALL]);
2870 set_user_noclip(id, codPlayer[id][PLAYER_NOCLIP][ALL]);
2871 set_user_godmode(id, codPlayer[id][PLAYER_GODMODE][ALL]);
2872
2873 codPlayer[id][PLAYER_LEFT_JUMPS] = codPlayer[id][PLAYER_JUMPS][ALL];
2874
2875 calculate_rockets_left(id);
2876 calculate_mines_left(id);
2877 calculate_dynamites_left(id);
2878 calculate_thunders_left(id);
2879 calculate_medkits_left(id);
2880 calculate_teleports_left(id);
2881
2882 set_gravity(id);
2883
2884 set_speed(id);
2885
2886 model_change(id);
2887
2888 render_change(id);
2889
2890 strip_weapons(id, PRIMARY);
2891 strip_weapons(id, SECONDARY);
2892
2893 new weaponName[22];
2894
2895 for (new i = 1; i < sizeof weapons; i++) {
2896 if ((1<<i) & (codPlayer[id][PLAYER_WEAPONS] | codPlayer[id][PLAYER_EXTRA_WEAPONS])) {
2897 get_weaponname(i, weaponName, charsmax(weaponName));
2898 give_item(id, weaponName);
2899 }
2900 }
2901
2902 new playerWeapons[32], weaponsNum;
2903
2904 get_user_weapons(id, playerWeapons, weaponsNum);
2905
2906 for (new i = 0; i < weaponsNum; i++) {
2907 if (playerWeapons[i] == CSW_KNIFE || playerWeapons[i] == CSW_C4 || playerWeapons[i] == CSW_HEGRENADE || playerWeapons[i] == CSW_FLASHBANG || playerWeapons[i] == CSW_SMOKEGRENADE) continue;
2908
2909 if (maxBpAmmo[playerWeapons[i]] > 0) cs_set_user_bpammo(id, playerWeapons[i], maxBpAmmo[playerWeapons[i]]);
2910 }
2911}
2912
2913public gravity_change(id)
2914{
2915 if (!is_user_alive(id)) return PLUGIN_CONTINUE;
2916
2917 set_user_gravity(id, Float:codPlayer[id][PLAYER_GRAVITY][ALL]);
2918
2919 static ret;
2920
2921 ExecuteForward(codForwards[GRAVITY_CHANGED], ret, id, Float:codPlayer[id][PLAYER_GRAVITY][ALL]);
2922
2923 return PLUGIN_CONTINUE;
2924}
2925
2926public set_gravity(id)
2927{
2928 new Float:gravity = 1.0;
2929
2930 for (new i = CLASS; i <= ROUND; i++) {
2931 if (codPlayer[id][PLAYER_GRAVITY][i] >= 0.0 && codPlayer[id][PLAYER_GRAVITY][i] < gravity) gravity = codPlayer[id][PLAYER_GRAVITY][i];
2932 else if (codPlayer[id][PLAYER_GRAVITY][i] < 0.0) gravity += codPlayer[id][PLAYER_GRAVITY][i];
2933 }
2934
2935 codPlayer[id][PLAYER_GRAVITY][ALL] = _:floatmax(0.01, gravity);
2936
2937 gravity_change(id);
2938}
2939
2940public set_speed(id)
2941{
2942 new Float:speed = 0.0;
2943
2944 speed += (get_condition(id) * 0.85);
2945
2946 for (new i = CLASS; i <= ROUND; i++) {
2947 if (codPlayer[id][PLAYER_SPEED][i] == COD_FREEZE) {
2948 speed = COD_FREEZE;
2949
2950 break;
2951 }
2952 else if (codPlayer[id][PLAYER_SPEED][i] >= 0.0 && codPlayer[id][PLAYER_SPEED][i] > speed) speed = (speed > 0.0 ? codPlayer[id][PLAYER_SPEED][i] : codPlayer[id][PLAYER_SPEED][i] + speed);
2953 else if (codPlayer[id][PLAYER_SPEED][i] < 0.0) speed += codPlayer[id][PLAYER_SPEED][i];
2954 }
2955
2956 codPlayer[id][PLAYER_SPEED][ALL] = _:speed;
2957
2958 if (!is_user_alive(id) || freezeTime || !codPlayer[id][PLAYER_CLASS]) return;
2959
2960 ExecuteHamB(Ham_CS_Player_ResetMaxSpeed, id);
2961}
2962
2963public model_change(id)
2964{
2965 if (!is_user_connected(id)) return PLUGIN_CONTINUE;
2966
2967 if (!codPlayer[id][PLAYER_MODEL][ALL]) cs_reset_user_model(id);
2968 else {
2969 static ctSkins[4][] = {"sas", "gsg9", "urban", "gign"}, tSkins[4][] = {"arctic", "leet", "guerilla", "terror"};
2970
2971 new model = random_num(0, 3);
2972
2973 cs_set_user_model(id, (cs_get_user_team(id) == CS_TEAM_T) ? ctSkins[model]: tSkins[model]);
2974 }
2975
2976 return PLUGIN_CONTINUE;
2977}
2978
2979public reset_player(id)
2980{
2981 rem_bit(id, dataLoaded);
2982
2983 remove_tasks(id);
2984
2985 clear_render(id);
2986
2987 for (new i = PLAYER_CLASS; i <= PLAYER_TIME_KS; i++) codPlayer[id][i] = 0;
2988 for (new i = PLAYER_LAST_ROCKET; i <= PLAYER_LAST_TELEPORT; i++) codPlayer[id][i] = _:0.0;
2989
2990 for (new i = CLASS; i <= ALL; i++) {
2991 codPlayer[id][PLAYER_GRAVITY][i] = _:1.0;
2992 codPlayer[id][PLAYER_SPEED][i] = _:0.0;
2993
2994 codPlayer[id][PLAYER_ROCKETS][i] = 0;
2995 codPlayer[id][PLAYER_MINES][i] = 0;
2996 codPlayer[id][PLAYER_DYNAMITES][i] = 0;
2997 codPlayer[id][PLAYER_THUNDERS][i] = 0;
2998 codPlayer[id][PLAYER_MEDKITS][i] = 0;
2999 codPlayer[id][PLAYER_TELEPORTS][i] = 0;
3000 codPlayer[id][PLAYER_JUMPS][i] = 0;
3001 codPlayer[id][PLAYER_BUNNYHOP][i] = 0;
3002 codPlayer[id][PLAYER_FOOTSTEPS][i] = 0;
3003 codPlayer[id][PLAYER_MODEL][i] = 0;
3004 codPlayer[id][PLAYER_ELIMINATOR][i] = 0;
3005 codPlayer[id][PLAYER_REDUCER][i] = 0;
3006 codPlayer[id][PLAYER_UNLIMITED_AMMO][i] = 0;
3007 codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][i] = 0;
3008 codPlayer[id][PLAYER_REDUCER_WEAPONS][i] = 0;
3009 codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][i] = 0;
3010 }
3011
3012 codPlayer[id][PLAYER_HUD_RED] = 0;
3013 codPlayer[id][PLAYER_HUD_GREEN] = 255;
3014 codPlayer[id][PLAYER_HUD_BLUE] = 0;
3015 codPlayer[id][PLAYER_HUD_POSX] = 70;
3016 codPlayer[id][PLAYER_HUD_POSY] = 6;
3017
3018 set_new_class(id);
3019 set_item(id);
3020}
3021
3022public end_kill_streak(id)
3023{
3024 id -= TASK_END_KILL_STREAK;
3025
3026 if (!is_user_connected(id))
3027 {
3028 remove_task(id + TASK_END_KILL_STREAK);
3029
3030 return PLUGIN_CONTINUE;
3031 }
3032
3033 if (--codPlayer[id][PLAYER_TIME_KS] == 0) {
3034 codPlayer[id][PLAYER_TIME_KS] = 0;
3035 codPlayer[id][PLAYER_KS] = 0;
3036
3037 remove_task(id + TASK_END_KILL_STREAK);
3038 }
3039
3040 return PLUGIN_CONTINUE;
3041}
3042
3043public remove_tasks(id)
3044{
3045 remove_task(id);
3046 remove_task(id + TASK_SHOW_INFO);
3047 remove_task(id + TASK_SHOW_AD);
3048 remove_task(id + TASK_SHOW_HELP);
3049 remove_task(id + TASK_SPEED_LIMIT);
3050 remove_task(id + TASK_SET_SPEED);
3051 remove_task(id + TASK_END_KILL_STREAK);
3052}
3053
3054stock remove_ents(id = 0, const className[] = "")
3055{
3056 if (!strlen(className)) {
3057 new const ents[][] = { "rocket", "mine", "dynamite", "medkit" };
3058
3059 for (new i = 0; i < sizeof(ents); i++) {
3060 new ent = find_ent_by_class(-1, ents[i]);
3061
3062 while (ent > 0) {
3063 if (!id || (id && entity_get_edict(ent, EV_ENT_owner) == id)) remove_entity(ent);
3064
3065 ent = find_ent_by_class(ent, ents[i]);
3066 }
3067 }
3068 } else {
3069 new ent = find_ent_by_class(0, className);
3070
3071 while (ent > 0) {
3072 if (!id || (id && entity_get_edict(ent, EV_ENT_owner) == id)) remove_entity(ent);
3073
3074 ent = find_ent_by_class(ent, className);
3075 }
3076 }
3077}
3078
3079public show_bonus_info()
3080{
3081 if (get_players_amount() > 0 && (lastInfo + 5.0 < get_gametime() || get_players_amount() == cvarMinBonusPlayers)) {
3082 if (get_players_amount() == cvarMinBonusPlayers) chat_print(0, "Serwer jest pelny, a to oznacza^x03 EXP x 2^x01!");
3083 else {
3084 new playersToFull = cvarMinBonusPlayers - get_players_amount();
3085
3086 chat_print(0, "Do pelnego serwera brakuj%s^x03 %i osob%s^x01. Exp jest wiekszy o^x03 %i%s^x01!", playersToFull > 1 ? (playersToFull < 5 ? "a" : "e") : "e", playersToFull, playersToFull == 1 ? "a" : (playersToFull < 5 ? "y" : ""), get_players_amount() * 10, "%%");
3087 }
3088
3089 lastInfo = floatround(get_gametime());
3090 }
3091}
3092
3093stock get_level_exp(level)
3094 return power(level, 2) * cvarLevelRatio;
3095
3096stock get_health(id, class_health = 1, stats_health = 1, bonus_health = 1, base_health = 1)
3097{
3098 new health;
3099
3100 if (class_health) health += get_user_class_info(id, codPlayer[id][PLAYER_CLASS], CLASS_HEAL);
3101 if (stats_health) health += codPlayer[id][PLAYER_HEAL];
3102 if (bonus_health) health += codPlayer[id][PLAYER_EXTRA_HEAL];
3103 if (base_health) health += 100;
3104
3105 return health;
3106}
3107
3108stock get_intelligence(id, class_intelligence = 1, stats_intelligence = 1, bonus_intelligence = 1)
3109{
3110 new intelligence;
3111
3112 if (class_intelligence) intelligence += get_user_class_info(id, codPlayer[id][PLAYER_CLASS], CLASS_INT);
3113 if (stats_intelligence) intelligence += codPlayer[id][PLAYER_INT];
3114 if (bonus_intelligence) intelligence += codPlayer[id][PLAYER_EXTRA_INT];
3115
3116 return intelligence;
3117}
3118
3119stock get_strength(id, class_strength = 1, stats_strength = 1, bonus_strength = 1)
3120{
3121 new strength;
3122
3123 if (class_strength) strength += get_user_class_info(id, codPlayer[id][PLAYER_CLASS], CLASS_STR);
3124 if (stats_strength) strength += codPlayer[id][PLAYER_STR];
3125 if (bonus_strength) strength += codPlayer[id][PLAYER_EXTRA_STR];
3126
3127 return strength;
3128}
3129
3130stock get_stamina(id, class_stamina = 1, stats_stamina = 1, bonus_stamina = 1)
3131{
3132 new stamina;
3133
3134 if (class_stamina) stamina += get_user_class_info(id, codPlayer[id][PLAYER_CLASS], CLASS_STAM);
3135 if (stats_stamina) stamina += codPlayer[id][PLAYER_STAM];
3136 if (bonus_stamina) stamina += codPlayer[id][PLAYER_EXTRA_STAM];
3137
3138 return stamina;
3139}
3140
3141stock get_condition(id, class_condition = 1, stats_condition = 1, bonus_condition = 1)
3142{
3143 new condition;
3144
3145 if (class_condition) condition += get_user_class_info(id, codPlayer[id][PLAYER_CLASS], CLASS_COND);
3146 if (stats_condition) condition += codPlayer[id][PLAYER_COND];
3147 if (bonus_condition) condition += codPlayer[id][PLAYER_EXTRA_COND];
3148
3149 return condition;
3150}
3151
3152public sql_init()
3153{
3154 new host[64], user[64], pass[64], db[64], queryData[512], error[128], errorNum;
3155
3156 get_cvar_string("cod_sql_host", host, charsmax(host));
3157 get_cvar_string("cod_sql_user", user, charsmax(user));
3158 get_cvar_string("cod_sql_pass", pass, charsmax(pass));
3159 get_cvar_string("cod_sql_db", db, charsmax(db));
3160
3161 sql = SQL_MakeDbTuple(host, user, pass, db);
3162
3163 connection = SQL_Connect(sql, errorNum, error, charsmax(error));
3164
3165 if (errorNum) {
3166 log_to_file(LOG_FILE, "[%s] SQL Error: %s (%d)", PLUGIN, error, errorNum);
3167
3168 set_task(5.0, "sql_init");
3169
3170 return;
3171 }
3172
3173 formatex(queryData, charsmax(queryData), "CREATE TABLE IF NOT EXISTS `cod_mod` (`name` VARCHAR(%i) NOT NULL, `class` VARCHAR(64) NOT NULL, `exp` INT UNSIGNED NOT NULL DEFAULT 0, `level` INT UNSIGNED NOT NULL DEFAULT 1, `intelligence` INT UNSIGNED NOT NULL DEFAULT 0, ", MAX_SAFE_NAME);
3174 add(queryData, charsmax(queryData), "`health` INT UNSIGNED NOT NULL DEFAULT 0, `stamina` INT UNSIGNED NOT NULL DEFAULT 0, `condition` INT UNSIGNED NOT NULL DEFAULT 0, `strength` INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY(`name`, `class`));");
3175
3176 new Handle:query = SQL_PrepareQuery(connection, queryData);
3177
3178 SQL_Execute(query);
3179
3180 SQL_FreeHandle(query);
3181
3182 sqlConnected = true;
3183}
3184
3185public load_data(id)
3186{
3187 if (!sqlConnected) {
3188 set_task(1.0, "load_data", id);
3189
3190 return;
3191 }
3192
3193 new playerId[1], queryData[128];
3194
3195 playerId[0] = id;
3196
3197 formatex(queryData, charsmax(queryData), "SELECT * FROM `cod_mod` WHERE name = ^"%s^"", codPlayer[id][PLAYER_NAME]);
3198
3199 SQL_ThreadQuery(sql, "load_data_handle", queryData, playerId, sizeof playerId);
3200}
3201
3202public load_data_handle(failState, Handle:query, error[], errorNum, playerId[], dataSize)
3203{
3204 if (failState) {
3205 if (failState == TQUERY_CONNECT_FAILED) log_to_file(LOG_FILE, "[%s] Could not connect to SQL database. Error: %s (%d)", PLUGIN, error, errorNum);
3206 else if (failState == TQUERY_QUERY_FAILED) log_to_file(LOG_FILE, "[%s] Threaded query failed. Error: %s (%d)", PLUGIN, error, errorNum);
3207
3208 return;
3209 }
3210
3211 new id = playerId[0], className[MAX_NAME], codClass[playerClassInfo], classId;
3212
3213 while (SQL_MoreResults(query)) {
3214 SQL_ReadResult(query, SQL_FieldNameToNum(query, "class"), className, charsmax(className));
3215
3216 if (equal(className, "hud")) {
3217 codPlayer[id][PLAYER_HUD_RED] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "level"));
3218 codPlayer[id][PLAYER_HUD_GREEN] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "exp"));
3219 codPlayer[id][PLAYER_HUD_BLUE] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "intelligence"));
3220 codPlayer[id][PLAYER_HUD_POSX] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "health"));
3221 codPlayer[id][PLAYER_HUD_POSY] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "stamina"));
3222
3223 set_bit(id, hudLoaded);
3224 } else {
3225 classId = get_class_id(className);
3226
3227 if (classId) {
3228 codClass[PCLASS_LEVEL] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "level"));
3229 codClass[PCLASS_EXP] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "exp"));
3230 codClass[PCLASS_INT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "intelligence"));
3231 codClass[PCLASS_HEAL] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "health"));
3232 codClass[PCLASS_STAM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "stamina"));
3233 codClass[PCLASS_STR] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "strength"));
3234 codClass[PCLASS_COND] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "condition"));
3235
3236 ArraySetArray(codPlayerClasses[id], classId, codClass);
3237 }
3238 }
3239
3240 SQL_NextRow(query);
3241 }
3242
3243 set_bit(id, dataLoaded);
3244
3245 if (is_user_alive(id)) select_fraction(id);
3246}
3247
3248public save_data(id, end)
3249{
3250 if (!codPlayer[id][PLAYER_CLASS] || !get_bit(id, dataLoaded)) return;
3251
3252 static queryData[512], className[MAX_NAME];
3253
3254 get_class_info(codPlayer[id][PLAYER_CLASS], CLASS_NAME, className, charsmax(className));
3255
3256 formatex(queryData, charsmax(queryData), "UPDATE `cod_mod` SET `exp` = (`exp` + %d), `level` = (`level` + %d), `intelligence` = '%d', `health` = '%d', `stamina` = '%d', `strength` = '%d', `condition` = '%d' WHERE `name` = ^"%s^" AND `class` = '%s'",
3257 codPlayer[id][PLAYER_GAINED_EXP], codPlayer[id][PLAYER_GAINED_LEVEL], codPlayer[id][PLAYER_INT], codPlayer[id][PLAYER_HEAL], codPlayer[id][PLAYER_STAM], codPlayer[id][PLAYER_STR], codPlayer[id][PLAYER_COND], codPlayer[id][PLAYER_NAME], className);
3258
3259 if (end == MAP_END) {
3260 new error[128], errorNum, Handle:query;
3261
3262 query = SQL_PrepareQuery(connection, queryData);
3263
3264 if (!SQL_Execute(query)) {
3265 errorNum = SQL_QueryError(query, error, charsmax(error));
3266
3267 log_to_file(LOG_FILE, "[%s] Non-threaded query failed. Error: %s (%d)", PLUGIN, error, errorNum);
3268 }
3269
3270 SQL_FreeHandle(query);
3271 } else SQL_ThreadQuery(sql, "ignore_handle", queryData);
3272
3273 codPlayer[id][PLAYER_EXP] += codPlayer[id][PLAYER_GAINED_EXP];
3274 codPlayer[id][PLAYER_GAINED_EXP] = 0;
3275
3276 codPlayer[id][PLAYER_LEVEL] += codPlayer[id][PLAYER_GAINED_LEVEL];
3277 codPlayer[id][PLAYER_GAINED_LEVEL] = 0;
3278
3279 static codClass[playerClassInfo];
3280
3281 codClass[PCLASS_LEVEL] = codPlayer[id][PLAYER_LEVEL];
3282 codClass[PCLASS_EXP] = codPlayer[id][PLAYER_EXP];
3283 codClass[PCLASS_INT] = codPlayer[id][PLAYER_INT];
3284 codClass[PCLASS_HEAL] = codPlayer[id][PLAYER_HEAL];
3285 codClass[PCLASS_STAM] = codPlayer[id][PLAYER_STAM];
3286 codClass[PCLASS_STR] = codPlayer[id][PLAYER_STR];
3287 codClass[PCLASS_COND] = codPlayer[id][PLAYER_COND];
3288
3289 ArraySetArray(codPlayerClasses[id], codPlayer[id][PLAYER_CLASS], codClass);
3290
3291 if (end) rem_bit(id, dataLoaded);
3292}
3293
3294public load_class(id, class)
3295{
3296 if (!get_bit(id, dataLoaded)) return;
3297
3298 new codClass[playerClassInfo];
3299
3300 ArrayGetArray(codPlayerClasses[id], class, codClass);
3301
3302 codPlayer[id][PLAYER_GAINED_EXP] = 0;
3303 codPlayer[id][PLAYER_GAINED_LEVEL] = 0;
3304 codPlayer[id][PLAYER_LEVEL] = max(0, codClass[PCLASS_LEVEL]);
3305 codPlayer[id][PLAYER_PROMOTION] = check_promotion(id, 0, class);
3306 codPlayer[id][PLAYER_EXP] = codClass[PCLASS_EXP];
3307 codPlayer[id][PLAYER_INT] = codClass[PCLASS_INT];
3308 codPlayer[id][PLAYER_HEAL] = codClass[PCLASS_HEAL];
3309 codPlayer[id][PLAYER_STAM] = codClass[PCLASS_STAM];
3310 codPlayer[id][PLAYER_STR] = codClass[PCLASS_STR];
3311 codPlayer[id][PLAYER_COND] = codClass[PCLASS_COND];
3312 codPlayer[id][PLAYER_WEAPONS] = get_user_class_info(id, class, CLASS_WEAPONS);
3313
3314 if (!class) return;
3315
3316 if (!codPlayer[id][PLAYER_LEVEL]) {
3317 codPlayer[id][PLAYER_LEVEL] = codClass[PCLASS_LEVEL] = 1;
3318
3319 ArraySetArray(codPlayerClasses[id], class, codClass);
3320
3321 new tempData[256], className[MAX_NAME];
3322
3323 get_class_info(class, CLASS_NAME, className, charsmax(className));
3324
3325 formatex(tempData, charsmax(tempData), "INSERT IGNORE INTO `cod_mod` (`name`, `class`) VALUES (^"%s^", '%s')", codPlayer[id][PLAYER_NAME], className);
3326
3327 SQL_ThreadQuery(sql, "ignore_handle", tempData);
3328 }
3329
3330 codPlayer[id][PLAYER_POINTS] = (codPlayer[id][PLAYER_LEVEL] - 1) - codPlayer[id][PLAYER_INT] - codPlayer[id][PLAYER_HEAL] - codPlayer[id][PLAYER_STAM] - codPlayer[id][PLAYER_STR] - codPlayer[id][PLAYER_COND];
3331}
3332
3333public ignore_handle(failState, Handle:query, error[], errorNum, data[], dataSize)
3334{
3335 if (failState) {
3336 if (failState == TQUERY_CONNECT_FAILED) log_to_file(LOG_FILE, "[%s] Could not connect to SQL database. Error: %s (%d)", PLUGIN, error, errorNum);
3337 else if (failState == TQUERY_QUERY_FAILED) log_to_file(LOG_FILE, "[%s] Threaded query failed. Error: %s (%d)", PLUGIN, error, errorNum);
3338 }
3339
3340 return PLUGIN_CONTINUE;
3341}
3342
3343public _cod_get_user_exp(id)
3344 return codPlayer[id][PLAYER_EXP];
3345
3346public _cod_set_user_exp(id, value, bonus)
3347{
3348 codPlayer[id][PLAYER_GAINED_EXP] = bonus ? get_exp_bonus(id, value) : value;
3349
3350 check_level(id);
3351}
3352
3353public _cod_get_user_bonus_exp(id, value)
3354 return get_exp_bonus(id, value);
3355
3356public _cod_get_level_exp(level)
3357 return get_level_exp(level);
3358
3359public _cod_get_user_level(id)
3360 return codPlayer[id][PLAYER_LEVEL];
3361
3362public _cod_get_user_highest_level(id)
3363{
3364 new level, codClass[classInfo];
3365
3366 for (new i = 1; i < ArraySize(codPlayerClasses[id]); i++) {
3367 ArrayGetArray(codPlayerClasses[id], i, codClass);
3368
3369 if (codClass[PCLASS_LEVEL] > level) level = codClass[PCLASS_LEVEL];
3370 }
3371
3372 return level;
3373}
3374
3375public _cod_get_user_class(id, &promotion)
3376{
3377 param_convert(2);
3378
3379 promotion = codPlayer[id][PLAYER_PROMOTION];
3380
3381 return codPlayer[id][PLAYER_CLASS];
3382}
3383
3384public _cod_get_user_class_name(id, dataReturn[], dataLength)
3385{
3386 param_convert(2);
3387
3388 codPlayer[id][PLAYER_PROMOTION] ? get_class_promotion_info(codPlayer[id][PLAYER_CLASS], codPlayer[id][PLAYER_PROMOTION], CLASS_NAME, dataReturn, dataLength) : get_class_info(codPlayer[id][PLAYER_CLASS], CLASS_NAME, dataReturn, dataLength);
3389}
3390
3391public _cod_get_user_promotion(id)
3392 return codPlayer[id][PLAYER_PROMOTION];
3393
3394public _cod_get_user_promotion_id(id)
3395 return codPlayer[id][PLAYER_PROMOTION_ID];
3396
3397public _cod_set_user_class(id, class, force)
3398{
3399 codPlayer[id][PLAYER_NEW_CLASS] = class;
3400
3401 if (force) set_new_class(id);
3402}
3403
3404public _cod_get_class_id(className[])
3405{
3406 param_convert(1);
3407
3408 return get_class_id(className);
3409}
3410
3411public _cod_get_class_name(class, promotion, dataReturn[], dataLength)
3412{
3413 param_convert(3);
3414
3415 promotion ? get_class_promotion_info(class, promotion, CLASS_NAME, dataReturn, dataLength) : get_class_info(class, CLASS_NAME, dataReturn, dataLength);
3416}
3417
3418public _cod_get_class_desc(class, promotion, dataReturn[], dataLength)
3419{
3420 param_convert(3);
3421
3422 promotion ? get_class_promotion_info(class, promotion, CLASS_NAME, dataReturn, dataLength) : get_class_info(class, CLASS_DESC, dataReturn, dataLength);
3423}
3424
3425public _cod_get_class_health(class, promotion)
3426 return promotion ? get_class_promotion_info(class, promotion, CLASS_HEAL) : get_class_info(class, CLASS_HEAL);
3427
3428public _cod_get_class_intelligence(class, promotion)
3429 return promotion ? get_class_promotion_info(class, promotion, CLASS_INT) : get_class_info(class, CLASS_INT);
3430
3431public _cod_get_class_stamina(class, promotion)
3432 return promotion ? get_class_promotion_info(class, promotion, CLASS_STAM) : get_class_info(class, CLASS_STAM);
3433
3434public _cod_get_class_strength(class, promotion)
3435 return promotion ? get_class_promotion_info(class, promotion, CLASS_STR) : get_class_info(class, CLASS_STR);
3436
3437public _cod_get_class_condition(class, promotion)
3438 return promotion ? get_class_promotion_info(class, promotion, CLASS_COND) : get_class_info(class, CLASS_COND);
3439
3440public _cod_get_classes_num()
3441 return ArraySize(codClasses) - 1;
3442
3443public _cod_get_user_item(id, &value)
3444{
3445 param_convert(2);
3446
3447 value = _cod_get_user_item_value(id);
3448
3449 return codPlayer[id][PLAYER_ITEM];
3450}
3451
3452public _cod_get_user_item_name(id, dataReturn[], dataLength)
3453{
3454 param_convert(2);
3455
3456 if (!codPlayer[id][PLAYER_ITEM]) formatex(dataReturn, dataLength, "Brak");
3457 else get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_NAME, dataReturn, dataLength);
3458}
3459
3460public _cod_get_user_item_value(id)
3461{
3462 new value = NONE;
3463
3464 if (get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_VALUE) > 0) ExecuteForward(get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_VALUE), value, id);
3465
3466 return value;
3467}
3468
3469public _cod_set_user_item(id, item, value)
3470 return set_item(id, item, value);
3471
3472public _cod_upgrade_user_item(id, check)
3473{
3474 if (!ArraySize(codItems)) return false;
3475
3476 if (check) return get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_UPGRADE) > 0 ? true : false;
3477
3478 switch (random_num(1, 10)) {
3479 case 1 .. 6: {
3480 new ret;
3481
3482 ExecuteForward(get_item_info(codPlayer[id][PLAYER_ITEM], ITEM_UPGRADE), ret, id);
3483
3484 if (ret == COD_STOP) return false;
3485
3486 codPlayer[id][PLAYER_ITEM_DURA] = cvarMaxDurability;
3487
3488 chat_print(id, "Twoj przedmiot zostal pomyslnie^x03 ulepszony^x01.");
3489 }
3490 case 7 .. 9: {
3491 new durability = random_num(cvarMinDamageDurability, cvarMaxDamageDurability);
3492
3493 codPlayer[id][PLAYER_ITEM_DURA] -= durability;
3494
3495 if (codPlayer[id][PLAYER_ITEM_DURA] <= 0) {
3496 set_item(id);
3497
3498 chat_print(id, "Ulepszenie^x03 nieudane^x01! Twoj przedmiot ulegl^x03 zniszczeniu^x01.");
3499 } else chat_print(id, "Ulepszenie^x03 nieudane^x01! Straciles^x03 %i^x01 wytrzymalosci przedmiotu.", durability);
3500 }
3501 case 10: {
3502 set_item(id);
3503
3504 chat_print(id, "Ulepszenie^x03 nieudane^x01! Twoj przedmiot ulegl^x03 zniszczeniu^x01.");
3505 }
3506 }
3507
3508 return true;
3509}
3510
3511public _cod_get_item_id(itemName[])
3512{
3513 param_convert(1);
3514
3515 new codItem[classInfo];
3516
3517 for (new i = 1; i < ArraySize(codItems); i++) {
3518 ArrayGetArray(codItems, i, codItem);
3519
3520 if (equali(codItem[ITEM_NAME], itemName)) return i;
3521 }
3522
3523 return 0;
3524}
3525
3526public _cod_get_item_name(item, dataReturn[], dataLength)
3527{
3528 param_convert(2);
3529
3530 if (!item) formatex(dataReturn, dataLength, "Brak");
3531 else get_item_info(item, ITEM_NAME, dataReturn, dataLength);
3532}
3533
3534public _cod_get_item_desc(item, dataReturn[], dataLength)
3535{
3536 param_convert(2);
3537
3538 if (!item) formatex(dataReturn, dataLength, "Brak");
3539 else get_item_info(item, ITEM_DESC, dataReturn, dataLength);
3540}
3541
3542public _cod_get_items_num()
3543 return ArraySize(codItems) - 1;
3544
3545public _cod_get_item_durability(id)
3546 return codPlayer[id][PLAYER_ITEM_DURA];
3547
3548public _cod_set_item_durability(id, value)
3549 codPlayer[id][PLAYER_ITEM_DURA] = min(max(0, value), cvarMaxDurability);
3550
3551public _cod_max_item_durability(id)
3552 return cvarMaxDurability;
3553
3554public _cod_get_user_bonus_health(id)
3555 return codPlayer[id][PLAYER_EXTRA_HEAL];
3556
3557public _cod_get_user_bonus_intelligence(id)
3558 return codPlayer[id][PLAYER_EXTRA_INT];
3559
3560public _cod_get_user_bonus_stamina(id)
3561 return codPlayer[id][PLAYER_EXTRA_STAM];
3562
3563public _cod_get_user_bonus_strength(id)
3564 return codPlayer[id][PLAYER_EXTRA_STR];
3565
3566public _cod_get_user_bonus_condition(id)
3567 return codPlayer[id][PLAYER_EXTRA_COND];
3568
3569public _cod_set_user_bonus_health(id, value)
3570 codPlayer[id][PLAYER_EXTRA_HEAL] = value;
3571
3572public _cod_set_user_bonus_intelligence(id, value)
3573 codPlayer[id][PLAYER_EXTRA_INT] = value;
3574
3575public _cod_set_user_bonus_stamina(id, value)
3576 codPlayer[id][PLAYER_EXTRA_STAM] = value;
3577
3578public _cod_set_user_bonus_strength(id, value)
3579 codPlayer[id][PLAYER_EXTRA_STR] = value;
3580
3581public _cod_set_user_bonus_condition(id, value)
3582{
3583 codPlayer[id][PLAYER_EXTRA_COND] = value;
3584
3585 set_speed(id);
3586}
3587
3588public _cod_add_user_bonus_health(id, value)
3589 codPlayer[id][PLAYER_EXTRA_HEAL] += value;
3590
3591public _cod_add_user_bonus_intelligence(id, value)
3592 codPlayer[id][PLAYER_EXTRA_INT] += value;
3593
3594public _cod_add_user_bonus_stamina(id, value)
3595 codPlayer[id][PLAYER_EXTRA_STAM] += value;
3596
3597public _cod_add_user_bonus_strength(id, value)
3598 codPlayer[id][PLAYER_EXTRA_STR] += value;
3599
3600public _cod_add_user_bonus_condition(id, value)
3601{
3602 codPlayer[id][PLAYER_EXTRA_COND] += value;
3603
3604 set_speed(id);
3605}
3606
3607public _cod_get_user_health(id, current_health, stats_health, class_health, bonus_health, base_health)
3608 return current_health ? get_user_health(id) : get_health(id, stats_health, class_health, bonus_health, base_health);
3609
3610public _cod_get_user_intelligence(id, stats_intelligence, class_intelligence, bonus_intelligence)
3611 return get_intelligence(id, stats_intelligence, class_intelligence, bonus_intelligence);
3612
3613public _cod_get_user_stamina(id, stats_stamina, class_stamina, bonus_stamina)
3614 return get_stamina(id, stats_stamina, class_stamina, bonus_stamina);
3615
3616public _cod_get_user_strength(id, stats_strength, class_strength, bonus_strength)
3617 return get_strength(id, stats_strength, class_strength, bonus_strength);
3618
3619public _cod_get_user_condition(id, stats_condition, class_condition, bonus_condition)
3620 return get_condition(id, stats_condition, class_condition, bonus_condition);
3621
3622public _cod_get_user_max_health(id)
3623 return get_health(id);
3624
3625public _cod_set_user_health(id, value, maximum)
3626 set_user_health(id, maximum ? min(value, get_health(id)) : value);
3627
3628public _cod_add_user_health(id, value, maximum)
3629 set_user_health(id, maximum ? min(get_user_health(id) + value, get_health(id)) : get_user_health(id) + value);
3630
3631public _cod_get_user_rockets(id, type)
3632 return codPlayer[id][PLAYER_ROCKETS][type];
3633
3634public _cod_get_user_mines(id, type)
3635 return codPlayer[id][PLAYER_MINES][type];
3636
3637public _cod_get_user_dynamites(id, type)
3638 return codPlayer[id][PLAYER_DYNAMITES][type];
3639
3640public _cod_get_user_thunders(id, type)
3641 return codPlayer[id][PLAYER_THUNDERS][type];
3642
3643public _cod_get_user_medkits(id, type)
3644 return codPlayer[id][PLAYER_MEDKITS][type];
3645
3646public _cod_get_user_teleports(id, type)
3647 return codPlayer[id][PLAYER_TELEPORTS][type];
3648
3649public _cod_get_user_multijumps(id, type)
3650 return codPlayer[id][PLAYER_JUMPS][type];
3651
3652public Float:_cod_get_user_gravity(id, type)
3653 return Float:codPlayer[id][PLAYER_GRAVITY][type];
3654
3655public Float:_cod_get_user_speed(id, type)
3656 return type == FULL? get_user_maxspeed(id) : Float:codPlayer[id][PLAYER_GRAVITY][type];
3657
3658public _cod_get_user_armor(id, value)
3659 return cs_get_user_armor(id);
3660
3661public _cod_get_user_money(id, value)
3662 return cs_get_user_money(id);
3663
3664public _cod_set_user_rockets(id, value, type)
3665{
3666 codPlayer[id][PLAYER_ROCKETS][type] = max(0, value);
3667
3668 calculate_rockets_left(id);
3669}
3670
3671public _cod_set_user_mines(id, value, type)
3672{
3673 codPlayer[id][PLAYER_MINES][type] = max(0, value);
3674
3675 calculate_mines_left(id);
3676}
3677
3678public _cod_set_user_dynamites(id, value, type)
3679{
3680 codPlayer[id][PLAYER_DYNAMITES][type] = max(0, value);
3681
3682 calculate_dynamites_left(id);
3683}
3684
3685public _cod_set_user_thunders(id, value, type)
3686{
3687 codPlayer[id][PLAYER_THUNDERS][type] = max(0, value);
3688
3689 calculate_thunders_left(id);
3690}
3691
3692public _cod_set_user_medkits(id, value, type)
3693{
3694 codPlayer[id][PLAYER_MEDKITS][type] = max(0, value);
3695
3696 calculate_medkits_left(id);
3697}
3698
3699public _cod_set_user_teleports(id, value, type)
3700{
3701 codPlayer[id][PLAYER_TELEPORTS][type] = codPlayer[id][PLAYER_TELEPORTS][type] == FULL ? FULL : value;
3702
3703 calculate_teleports_left(id);
3704}
3705
3706public _cod_set_user_multijumps(id, value, type)
3707{
3708 codPlayer[id][PLAYER_JUMPS][type] = max(0, value);
3709
3710 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][PLAYER_JUMPS][ALL] += codPlayer[id][PLAYER_JUMPS][i];
3711
3712 codPlayer[id][PLAYER_LEFT_JUMPS] = codPlayer[id][PLAYER_JUMPS][ALL];
3713}
3714
3715public _cod_set_user_gravity(id, Float:value, type)
3716{
3717 codPlayer[id][PLAYER_GRAVITY][type] = _:(type == ALL ? floatmax(0.01, value) : value);
3718
3719 set_gravity(id);
3720}
3721
3722public _cod_set_user_speed(id, Float:value, type)
3723{
3724 codPlayer[id][PLAYER_SPEED][type] = _:value;
3725
3726 set_speed(id);
3727}
3728
3729public _cod_set_user_armor(id, value)
3730 cs_set_user_armor(id, max(0, value), CS_ARMOR_KEVLAR);
3731
3732public _cod_set_user_money(id, value)
3733 cs_set_user_money(id, max(0, min(value, MAX_MONEY)));
3734
3735public _cod_add_user_rockets(id, value, type)
3736{
3737 codPlayer[id][PLAYER_ROCKETS][type] = max(0, codPlayer[id][PLAYER_ROCKETS][type] + value);
3738
3739 calculate_rockets_left(id);
3740}
3741
3742public _cod_add_user_mines(id, value, type)
3743{
3744 codPlayer[id][PLAYER_MINES][type] = max(0, codPlayer[id][PLAYER_MINES][type] + value);
3745
3746 calculate_mines_left(id);
3747}
3748
3749public _cod_add_user_dynamites(id, value, type)
3750{
3751 codPlayer[id][PLAYER_DYNAMITES][type] = max(0, codPlayer[id][PLAYER_DYNAMITES][type] + value);
3752
3753 calculate_dynamites_left(id);
3754}
3755
3756public _cod_add_user_thunders(id, value, type)
3757{
3758 codPlayer[id][PLAYER_THUNDERS][type] = max(0, codPlayer[id][PLAYER_THUNDERS][type] + value);
3759
3760 calculate_thunders_left(id);
3761}
3762
3763public _cod_add_user_medkits(id, value, type)
3764{
3765 codPlayer[id][PLAYER_MEDKITS][type] = max(0, codPlayer[id][PLAYER_MEDKITS][type] + value);
3766
3767 calculate_medkits_left(id);
3768}
3769
3770public _cod_add_user_teleports(id, value, type)
3771{
3772 codPlayer[id][PLAYER_TELEPORTS][type] = codPlayer[id][PLAYER_TELEPORTS][type] == FULL ? FULL : max(0, codPlayer[id][PLAYER_TELEPORTS][type] + value);
3773
3774 calculate_teleports_left(id);
3775}
3776
3777public _cod_add_user_multijumps(id, value, type)
3778{
3779 codPlayer[id][PLAYER_JUMPS][type] = max(0, codPlayer[id][PLAYER_JUMPS][type] + value);
3780
3781 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][PLAYER_JUMPS][ALL] += codPlayer[id][PLAYER_JUMPS][i];
3782
3783 codPlayer[id][PLAYER_LEFT_JUMPS] = codPlayer[id][PLAYER_JUMPS][ALL];
3784}
3785
3786public _cod_add_user_gravity(id, Float:value, type)
3787{
3788 codPlayer[id][PLAYER_GRAVITY][type] = _:(type == ALL ? floatmax(0.01, codPlayer[id][PLAYER_GRAVITY][type] + value) : codPlayer[id][PLAYER_GRAVITY][type] + value);
3789
3790 set_gravity(id);
3791}
3792
3793public _cod_add_user_speed(id, Float:value, type)
3794{
3795 codPlayer[id][PLAYER_SPEED][type] += _:value;
3796
3797 set_speed(id);
3798}
3799
3800public _cod_add_user_armor(id, value)
3801 cs_set_user_armor(id, max(0, cs_get_user_armor(id) + value), CS_ARMOR_KEVLAR);
3802
3803public _cod_add_user_money(id, value)
3804{
3805 cs_set_user_money(id, max(0, min(cs_get_user_money(id) + value, MAX_MONEY)));
3806}
3807
3808public _cod_use_user_rocket(id)
3809 use_rocket(id);
3810
3811public _cod_use_user_mine(id)
3812 use_mine(id);
3813
3814public _cod_use_user_dynamite(id)
3815 use_dynamite(id);
3816
3817public _cod_use_user_thunder(id)
3818 use_thunder(id);
3819
3820public _cod_use_user_medkit(id)
3821 use_medkit(id);
3822
3823public _cod_use_user_teleport(id)
3824 use_teleport(id);
3825
3826public _cod_get_user_resistance(id, type)
3827 return codPlayer[id][PLAYER_RESISTANCE][type];
3828
3829public _cod_get_user_bunnyhop(id, type)
3830 return codPlayer[id][PLAYER_BUNNYHOP][type];
3831
3832public _cod_get_user_footsteps(id, type)
3833 return codPlayer[id][PLAYER_FOOTSTEPS][type];
3834
3835public _cod_get_user_model(id, type)
3836 return codPlayer[id][PLAYER_MODEL][type];
3837
3838public _cod_get_user_godmode(id, type)
3839 return codPlayer[id][PLAYER_GODMODE][type];
3840
3841public _cod_get_user_noclip(id, type)
3842 return codPlayer[id][PLAYER_NOCLIP][type];
3843
3844public _cod_get_user_unlimited_ammo(id, type, weapon)
3845{
3846 if (weapon) return (codPlayer[id][PLAYER_UNLIMITED_AMMO][type] && (codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][type] <= 0 || 1<<codPlayer[id][PLAYER_WEAPON] & codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][type]));
3847 else return codPlayer[id][PLAYER_UNLIMITED_AMMO][type];
3848}
3849
3850public _cod_get_user_recoil_eliminator(id, type, weapon)
3851{
3852 if (weapon) return (codPlayer[id][PLAYER_ELIMINATOR][type] && (codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][type] <= 0 || 1<<codPlayer[id][PLAYER_WEAPON] & codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][type]));
3853 return codPlayer[id][PLAYER_ELIMINATOR][type];
3854}
3855
3856public _cod_get_user_recoil_reducer(id, type, weapon)
3857{
3858 if (weapon) return (codPlayer[id][PLAYER_REDUCER][type] && (codPlayer[id][PLAYER_REDUCER_WEAPONS][type] <= 0|| 1<<codPlayer[id][PLAYER_WEAPON] & codPlayer[id][PLAYER_REDUCER_WEAPONS][type]));
3859 return codPlayer[id][PLAYER_REDUCER][type];
3860}
3861
3862public _cod_set_user_resistance(id, value, type)
3863{
3864 codPlayer[id][PLAYER_RESISTANCE][type] = value;
3865
3866 new bool:enabled;
3867
3868 for (new i = CLASS; i <= ROUND; i++) {
3869 if (codPlayer[id][PLAYER_RESISTANCE][i]) enabled = true;
3870 }
3871
3872 codPlayer[id][PLAYER_RESISTANCE][ALL] = enabled;
3873}
3874
3875public _cod_set_user_godmode(id, value, type)
3876{
3877 codPlayer[id][PLAYER_GODMODE][type] = value;
3878
3879 new bool:enabled;
3880
3881 for (new i = CLASS; i <= ROUND; i++) {
3882 if (codPlayer[id][PLAYER_GODMODE][i]) enabled = true;
3883 }
3884
3885 set_user_godmode(id, enabled);
3886
3887 codPlayer[id][PLAYER_GODMODE][ALL] = enabled;
3888}
3889
3890public _cod_set_user_noclip(id, value, type)
3891{
3892 codPlayer[id][PLAYER_NOCLIP][type] = value;
3893
3894 new bool:enabled;
3895
3896 for (new i = CLASS; i <= ROUND; i++) {
3897 if (codPlayer[id][PLAYER_NOCLIP][i]) enabled = true;
3898 }
3899
3900 codPlayer[id][PLAYER_NOCLIP][ALL] = enabled;
3901
3902 set_user_noclip(id, enabled);
3903
3904 if (!codPlayer[id][PLAYER_NOCLIP][ALL]) check_if_player_stuck(id);
3905}
3906
3907public _cod_set_user_bunnyhop(id, value, type)
3908{
3909 codPlayer[id][PLAYER_BUNNYHOP][type] = value;
3910
3911 new bool:enabled;
3912
3913 for (new i = CLASS; i <= ROUND; i++) {
3914 if (codPlayer[id][PLAYER_BUNNYHOP][i]) enabled = true;
3915 }
3916
3917 codPlayer[id][PLAYER_BUNNYHOP][ALL] = enabled;
3918}
3919
3920public _cod_set_user_footsteps(id, value, type)
3921{
3922 codPlayer[id][PLAYER_FOOTSTEPS][type] = value;
3923
3924 new bool:enabled;
3925
3926 for (new i = CLASS; i <= ROUND; i++) {
3927 if (codPlayer[id][PLAYER_FOOTSTEPS][i]) enabled = true;
3928 }
3929
3930 codPlayer[id][PLAYER_FOOTSTEPS][ALL] = enabled;
3931
3932 set_user_footsteps(id, enabled);
3933}
3934
3935public _cod_set_user_model(id, value, type)
3936{
3937 codPlayer[id][PLAYER_MODEL][type] = value;
3938
3939 new bool:enabled;
3940
3941 for (new i = CLASS; i <= ROUND; i++) {
3942 if (codPlayer[id][PLAYER_MODEL][i]) enabled = true;
3943 }
3944
3945 codPlayer[id][PLAYER_MODEL][ALL] = enabled;
3946
3947 model_change(id);
3948}
3949
3950public _cod_set_user_unlimited_ammo(id, value, type, weapon)
3951{
3952 codPlayer[id][PLAYER_UNLIMITED_AMMO][type] = value;
3953 codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][type] = weapon;
3954
3955 new bool:enabled, weapons;
3956
3957 for (new i = CLASS; i <= ROUND; i++) {
3958 if (codPlayer[id][PLAYER_UNLIMITED_AMMO][i]) enabled = true;
3959
3960 if (codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][i] == FULL) weapons = FULL;
3961 else if (codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][i]) weapons == FULL ? (weapons = FULL) : (weapons |= codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][i]);
3962 }
3963
3964 codPlayer[id][PLAYER_UNLIMITED_AMMO][ALL] = enabled;
3965 codPlayer[id][PLAYER_UNLIMITED_AMMO_WEAPONS][ALL] = weapons;
3966}
3967
3968public _cod_set_user_recoil_eliminator(id, value, type, weapon)
3969{
3970 codPlayer[id][PLAYER_ELIMINATOR][type] = value;
3971 codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][type] = weapon;
3972
3973 new bool:enabled, weapons;
3974
3975 for (new i = CLASS; i <= ROUND; i++) {
3976 if (codPlayer[id][PLAYER_ELIMINATOR][i]) enabled = true;
3977
3978 if (codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][i] == FULL) weapons = FULL;
3979 else if (codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][i]) weapons == FULL ? (weapons = FULL) : (weapons |= codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][i]);
3980 }
3981
3982 codPlayer[id][PLAYER_ELIMINATOR][ALL] = enabled;
3983 codPlayer[id][PLAYER_ELIMINATOR_WEAPONS][ALL] = weapons;
3984}
3985
3986public _cod_set_user_recoil_reducer(id, value, type, weapon)
3987{
3988 codPlayer[id][PLAYER_REDUCER][type] = value;
3989 codPlayer[id][PLAYER_REDUCER_WEAPONS][type] = weapon;
3990
3991 new bool:enabled, weapons;
3992
3993 for (new i = CLASS; i <= ROUND; i++) {
3994 if (codPlayer[id][PLAYER_REDUCER][i]) enabled = true;
3995
3996 if (codPlayer[id][PLAYER_REDUCER_WEAPONS][i] == FULL) weapons = FULL;
3997 else if (codPlayer[id][PLAYER_REDUCER_WEAPONS][i]) weapons == FULL ? (weapons = FULL) : (weapons |= codPlayer[id][PLAYER_REDUCER_WEAPONS][i]);
3998 }
3999
4000 codPlayer[id][PLAYER_REDUCER][ALL] = enabled;
4001 codPlayer[id][PLAYER_REDUCER_WEAPONS][ALL] = weapons;
4002}
4003
4004public _cod_give_weapon(id, weapon, amount)
4005{
4006 new weaponName[22];
4007
4008 codPlayer[id][PLAYER_EXTRA_WEAPONS] |= (1<<weapon);
4009
4010 get_weaponname(weapon, weaponName, charsmax(weaponName));
4011
4012 give_item(id, weaponName);
4013
4014 if (amount > cs_get_user_bpammo(id, weapon)) cs_set_user_bpammo(id, weapon, amount);
4015
4016 if (weapon != CSW_KNIFE && weapon != CSW_C4 && weapon != CSW_HEGRENADE && weapon != CSW_FLASHBANG && weapon != CSW_SMOKEGRENADE) cs_set_user_bpammo(id, weapon, maxBpAmmo[weapon]);
4017}
4018
4019public _cod_take_weapon(id, weapon)
4020{
4021 codPlayer[id][PLAYER_EXTRA_WEAPONS] &= ~(1<<weapon);
4022
4023 if ((1<<weapon) & (allowedWeapons | codPlayer[id][PLAYER_WEAPONS])) return;
4024
4025 new weaponName[22];
4026
4027 get_weaponname(weapon, weaponName, charsmax(weaponName));
4028
4029 if (!((1<<weapon) & (1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_FLASHBANG))) engclient_cmd(id, "drop", weaponName);
4030}
4031
4032public _cod_get_user_weapon(id)
4033 return codPlayer[id][PLAYER_WEAPON];
4034
4035public _cod_get_user_render(id, type)
4036 return render_count(id, type);
4037
4038public _cod_set_user_render(id, value, type, status, weapon, Float:timer)
4039{
4040 if (timer == 0.0) {
4041 new codRender[renderInfo];
4042
4043 codRender[RENDER_TYPE] = type;
4044 codRender[RENDER_VALUE] = max(0, min(value, 256));
4045 codRender[RENDER_STATUS] = status;
4046 codRender[RENDER_WEAPON] = weapon;
4047
4048 switch (type) {
4049 case CLASS, ITEM, ADDITIONAL: ArraySetArray(codPlayerRender[id], type, codRender);
4050 case ROUND: ArrayPushArray(codPlayerRender[id], codRender);
4051 }
4052
4053 render_change(id);
4054 } else {
4055 set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, max(0, value));
4056
4057 set_bit(id, renderTimer);
4058
4059 set_task(timer, "reset_render", id + TASK_RENDER);
4060
4061 make_bar_timer(id, floatround(timer));
4062 }
4063}
4064
4065public _cod_set_user_glow(id, effect, red, green, blue, model, amount, Float:timer)
4066{
4067 set_bit(id, glowActive);
4068
4069 set_user_rendering(id, effect, red, green, blue, model, amount);
4070
4071 if (timer != 0.0) set_task(timer, "reset_glow", id + TASK_GLOW);
4072}
4073
4074public reset_render(id)
4075{
4076 id -= TASK_RENDER;
4077
4078 rem_bit(id, renderTimer);
4079
4080 if (is_user_connected(id)) {
4081 set_user_rendering(id);
4082
4083 render_change(id);
4084 }
4085}
4086
4087public reset_glow(id)
4088{
4089 id -= TASK_GLOW;
4090
4091 rem_bit(id, glowActive);
4092
4093 if (is_user_connected(id)) {
4094 set_user_rendering(id);
4095
4096 render_change(id);
4097 }
4098}
4099
4100public _cod_display_fade(id, duration, holdtime, fadetype, red, green, blue, alpha)
4101 display_fade(id, duration * (1<<12), holdtime * (1<<12), fadetype, red, green, blue, alpha);
4102
4103public _cod_display_icon(id, const icon[], enable, red, green, blue)
4104{
4105 if (!is_user_alive(id)) return;
4106
4107 param_convert(2);
4108
4109 static msgStatusIcon;
4110
4111 if (!msgStatusIcon) msgStatusIcon = get_user_msgid("StatusIcon");
4112
4113 message_begin(id ? MSG_ONE : MSG_ALL, msgStatusIcon, _, id);
4114 write_byte(enable);
4115 write_string(icon);
4116
4117 if (enable) {
4118 write_byte(red);
4119 write_byte(green);
4120 write_byte(blue);
4121 }
4122
4123 message_end();
4124}
4125
4126public _cod_print_chat(id, const text[], any:...)
4127{
4128 static message[192];
4129
4130 for (new i = 2; i <= numargs(); i++) param_convert(i);
4131
4132 if (numargs() == 2) copy(message, charsmax(message), text);
4133 else vformat(message, charsmax(message), text, 3);
4134
4135 chat_print(id, message);
4136}
4137
4138public _cod_log_error(const plugin[], const text[], any:...)
4139{
4140 static error[512];
4141
4142 for (new i = 1; i <= numargs(); i++) param_convert(i);
4143
4144 if (numargs() == 2) copy(error, charsmax(error), text);
4145 else vformat(error, charsmax(error), text, 3);
4146
4147 log_to_file(LOG_FILE, "[%s] %s", plugin, error);
4148}
4149
4150public _cod_show_hud(id, type, red, green, blue, Float:x, Float:y, effects, Float:fxtime, Float:holdtime, Float:fadeintime, Float:fadeouttime, const text[], any:...)
4151{
4152 static message[192];
4153
4154 for (new i = 13; i <= numargs(); i++) param_convert(i);
4155
4156 if (numargs() == 13) copy(message, charsmax(message), text);
4157 else vformat(message, charsmax(message), text, 14);
4158
4159 show_hud(id, message, type, red, green, blue, Float:x, Float:y, effects, Float:fxtime, Float:holdtime, Float:fadeintime, Float:fadeouttime);
4160}
4161
4162public _cod_cmd_execute(id, const text[], any:...)
4163{
4164 static message[192];
4165
4166 for (new i = 2; i <= numargs(); i++) param_convert(i);
4167
4168 if (numargs() == 2) copy(message, charsmax(message), text);
4169 else vformat(message, charsmax(message), text, 3);
4170
4171 cmd_execute(id, message);
4172}
4173
4174public _cod_sql_string(const source[], dest[], length)
4175{
4176 param_convert(1);
4177 param_convert(2);
4178
4179 sql_string(source, dest, length);
4180}
4181
4182public _cod_screen_shake(id, amplitude, duration, frequency)
4183 screen_shake(id, amplitude, duration, frequency);
4184
4185public _cod_refill_ammo(id)
4186 set_user_clip(id);
4187
4188public _cod_make_explosion(ent, distance, explosion, Float:damage_distance, Float:damage, Float:factor, suicide)
4189 make_explosion(ent, distance, explosion, damage_distance, damage, factor, suicide);
4190
4191public _cod_make_bartimer(id, duration, start)
4192 make_bar_timer(id, duration, start);
4193
4194public _cod_drop_weapon(id)
4195 engclient_cmd(id, "drop");
4196
4197public _cod_repeat_damage(attacker, victim, Float:damage, Float:time, counter, flags, instant)
4198{
4199 new data[5];
4200
4201 data[ATTACKER] = attacker;
4202 data[VICTIM] = victim;
4203 data[DAMAGE] = floatround(damage);
4204 data[COUNTER] = counter;
4205 data[FLAGS] = flags;
4206
4207 remove_task(victim + attacker + TASK_DAMAGE);
4208
4209 if (damage > 0.0 && time > 0.0) {
4210 set_task(time, "repeat_damage", victim + attacker + TASK_DAMAGE, data, sizeof(data), counter ? "a" : "b", counter - instant);
4211
4212 if (instant) repeat_damage(data);
4213 }
4214}
4215
4216public repeat_damage(data[])
4217{
4218 if (!is_user_alive(data[VICTIM]))
4219 {
4220 remove_task(data[VICTIM] + data[ATTACKER] + TASK_DAMAGE);
4221
4222 return;
4223 }
4224
4225 if (data[COUNTER]) data[COUNTER]--;
4226
4227 switch (data[FLAGS]) {
4228 case FIRE: {
4229 new origin[3], flags = pev(data[VICTIM], pev_flags);
4230
4231 get_user_origin(data[VICTIM], origin);
4232
4233 if (flags & FL_INWATER || data[COUNTER] == 0) {
4234 message_begin(MSG_PVS, SVC_TEMPENTITY, origin);
4235 write_byte(TE_SMOKE);
4236 write_coord(origin[0]);
4237 write_coord(origin[1]);
4238 write_coord(origin[2] - 50);
4239 write_short(codSprite[SPRITE_SMOKE]);
4240 write_byte(random_num(15, 20));
4241 write_byte(random_num(10, 20));
4242 message_end();
4243
4244 remove_task(data[VICTIM] + data[ATTACKER] + TASK_DAMAGE);
4245
4246 return;
4247 }
4248
4249 message_begin(MSG_PVS, SVC_TEMPENTITY, origin);
4250 write_byte(TE_SPRITE);
4251 write_coord(origin[0] + random_num(-5, 5));
4252 write_coord(origin[1] + random_num(-5, 5));
4253 write_coord(origin[2] + random_num(-10, 10));
4254 write_short(codSprite[SPRITE_FIRE]);
4255 write_byte(random_num(5, 10));
4256 write_byte(200);
4257 message_end();
4258
4259 display_fade(data[VICTIM], (1<<12), (1<<12), 0x0000, 255, 165, 0, 80);
4260
4261 data[FLAGS] = DMG_BURN;
4262 }
4263 case POISON: {
4264 display_fade(data[VICTIM], (1<<12), (1<<12), 0x0000, 0, 150, 60, 120);
4265
4266 data[FLAGS] = DMG_NERVEGAS;
4267 }
4268 case HEAL: {
4269 if (get_user_health(data[VICTIM]) < cod_get_user_max_health(data[VICTIM])) {
4270 display_fade(data[VICTIM], (1<<12), (1<<12), 0x0000, 250, 0, 0, 40);
4271
4272 cod_add_user_health(data[VICTIM], data[DAMAGE], 1);
4273 }
4274
4275 return;
4276 }
4277 }
4278
4279 cod_inflict_damage(data[ATTACKER], data[VICTIM], float(data[DAMAGE]), 0.0, data[FLAGS]);
4280}
4281
4282public _cod_inflict_damage(attacker, victim, Float:damage, Float:factor, flags)
4283 if (!codPlayer[victim][PLAYER_RESISTANCE][ALL] || (codPlayer[victim][PLAYER_RESISTANCE][ALL] && !(flags & DMG_CODSKILL))) ExecuteHam(Ham_TakeDamage, victim, attacker, attacker, damage + get_intelligence(attacker) * factor, DMG_CODSKILL | flags);
4284
4285public Float:_cod_kill_player(killer, victim, flags)
4286{
4287 if (is_user_alive(victim)) {
4288 cs_set_user_armor(victim, 0, CS_ARMOR_NONE);
4289
4290 cod_inflict_damage(killer, victim, float(get_user_health(victim) + 1), 0.0, flags);
4291 }
4292
4293 return COD_BLOCK;
4294}
4295
4296public _cod_respawn_player(id, enemy)
4297{
4298 if (!is_user_alive(id)) {
4299 if (enemy) set_task(0.1, "respawn_player_enemy_spawn", id + TASK_RESPAWN);
4300 else set_task(0.1, "respawn_player", id + TASK_RESPAWN);
4301 }
4302}
4303
4304public respawn_player(id)
4305 ExecuteHamB(Ham_CS_RoundRespawn, id - TASK_RESPAWN);
4306
4307public respawn_player_enemy_spawn(id)
4308{
4309 id -= TASK_RESPAWN;
4310
4311 new CsTeams:team = cs_get_user_team(id);
4312
4313 cs_set_user_team(id, (team == CS_TEAM_CT) ? CS_TEAM_T : CS_TEAM_CT);
4314
4315 ExecuteHamB(Ham_CS_RoundRespawn, id);
4316
4317 cs_set_user_team(id, team);
4318
4319 check_if_player_stuck(id);
4320}
4321
4322public _cod_teleport_to_spawn(id, enemy)
4323{
4324 new Float:spawnOrigin[3], Float:spawnAngle[3], team = get_user_team(id);
4325
4326 find_free_spawn(enemy ? (team == 1 ? 2 : 1) : team, spawnOrigin, spawnAngle);
4327
4328 set_pev(id, pev_origin, spawnOrigin);
4329 set_pev(id, pev_angles, spawnAngle);
4330
4331 check_if_player_stuck(id);
4332}
4333
4334public _cod_random_upgrade(&value, upgradeMin, upgradeMax, valueMin, valueMax)
4335{
4336 param_convert(1);
4337
4338 if ((valueMin != NONE && value <= valueMin) || (valueMax != NONE && value >= valueMax)) return COD_STOP;
4339
4340 value = max(0, value + (((upgradeMin > 0 && upgradeMax > 0) || (upgradeMin < 0 && upgradeMax < 0)) ? random_num(upgradeMin, upgradeMax) : (random_num(0, 1) ? random_num(upgradeMin, -1) : random_num(1, upgradeMax))));
4341
4342 if (valueMax != NONE) value = min(value, valueMax);
4343 if (valueMin != NONE) value = max(value, valueMin);
4344
4345 return COD_CONTINUE;
4346}
4347
4348public _cod_percent_chance(percent)
4349 return random_num(1, 100) <= percent ? true : false;
4350
4351public _cod_is_enough_space(ent, Float:distance)
4352 return is_enough_space(ent, distance);
4353
4354public _cod_remove_ents(id, className[])
4355{
4356 param_convert(2);
4357
4358 remove_ents(id, className);
4359}
4360
4361public _cod_register_item(plugin, params)
4362{
4363 if (params != 4) return PLUGIN_CONTINUE;
4364
4365 new codItem[itemInfo];
4366
4367 get_string(1, codItem[ITEM_NAME], charsmax(codItem[ITEM_NAME]));
4368 get_string(2, codItem[ITEM_DESC], charsmax(codItem[ITEM_DESC]));
4369
4370 codItem[ITEM_RANDOM_MIN] = get_param(3);
4371 codItem[ITEM_RANDOM_MAX] = get_param(4);
4372
4373 codItem[ITEM_PLUGIN] = plugin;
4374
4375 codItem[ITEM_GIVE] = CreateOneForward(plugin, "cod_item_enabled", FP_CELL, FP_CELL);
4376 codItem[ITEM_DROP] = CreateOneForward(plugin, "cod_item_disabled", FP_CELL);
4377 codItem[ITEM_SPAWNED] = CreateOneForward(plugin, "cod_item_spawned", FP_CELL, FP_CELL);
4378 codItem[ITEM_KILL] = CreateOneForward(plugin, "cod_item_kill", FP_CELL, FP_CELL, FP_CELL);
4379 codItem[ITEM_KILLED] = CreateOneForward(plugin, "cod_item_killed", FP_CELL, FP_CELL, FP_CELL);
4380 codItem[ITEM_SKILL_USED] = CreateOneForward(plugin, "cod_item_skill_used", FP_CELL);
4381 codItem[ITEM_UPGRADE] = CreateOneForward(plugin, "cod_item_upgrade", FP_CELL);
4382 codItem[ITEM_VALUE] = CreateOneForward(plugin, "cod_item_value", FP_CELL);
4383 codItem[ITEM_DAMAGE_ATTACKER] = get_func_id("cod_item_damage_attacker", plugin);
4384 codItem[ITEM_DAMAGE_VICTIM] = get_func_id("cod_item_damage_victim", plugin);
4385
4386 ArrayPushArray(codItems, codItem);
4387
4388 return ArraySize(codItems) - 1;
4389}
4390
4391public _cod_register_class(plugin, params)
4392{
4393 if (params != 10) return PLUGIN_CONTINUE;
4394
4395 new codClass[classInfo];
4396
4397 get_string(1, codClass[CLASS_NAME], charsmax(codClass[CLASS_NAME]));
4398 get_string(2, codClass[CLASS_DESC], charsmax(codClass[CLASS_DESC]));
4399 get_string(3, codClass[CLASS_FRACTION], charsmax(codClass[CLASS_FRACTION]));
4400
4401 if (!equal(codClass[CLASS_FRACTION], "")) check_fraction(codClass[CLASS_FRACTION]);
4402 else codClass[CLASS_FRACTION] = "Brak";
4403
4404 codClass[CLASS_WEAPONS] = get_param(4);
4405 codClass[CLASS_HEAL] = get_param(5);
4406 codClass[CLASS_INT] = get_param(6);
4407 codClass[CLASS_STR] = get_param(7);
4408 codClass[CLASS_STAM] = get_param(8);
4409 codClass[CLASS_COND] = get_param(9);
4410 codClass[CLASS_FLAG] = get_param(10);
4411
4412 codClass[CLASS_PLUGIN] = plugin;
4413
4414 codClass[CLASS_ENABLED] = CreateOneForward(plugin, "cod_class_enabled", FP_CELL, FP_CELL);
4415 codClass[CLASS_DISABLED] = CreateOneForward(plugin, "cod_class_disabled", FP_CELL);
4416 codClass[CLASS_SPAWNED] = CreateOneForward(plugin, "cod_class_spawned", FP_CELL, FP_CELL);
4417 codClass[CLASS_KILL] = CreateOneForward(plugin, "cod_class_kill", FP_CELL, FP_CELL, FP_CELL);
4418 codClass[CLASS_KILLED] = CreateOneForward(plugin, "cod_class_killed", FP_CELL, FP_CELL, FP_CELL);
4419 codClass[CLASS_SKILL_USED] = CreateOneForward(plugin, "cod_class_skill_used", FP_CELL);
4420 codClass[CLASS_DAMAGE_VICTIM] = get_func_id("cod_class_damage_victim", plugin);
4421 codClass[CLASS_DAMAGE_ATTACKER] = get_func_id("cod_class_damage_attacker", plugin);
4422
4423 ArrayPushArray(codClasses, codClass);
4424
4425 return ArraySize(codClasses) - 1;
4426}
4427
4428public _cod_register_promotion(plugin, params)
4429{
4430 if (params != 12) return PLUGIN_CONTINUE;
4431
4432 new codPromotion[classInfo], className[MAX_NAME];
4433
4434 get_string(1, codPromotion[CLASS_NAME], charsmax(codPromotion[CLASS_NAME]));
4435 get_string(2, codPromotion[CLASS_DESC], charsmax(codPromotion[CLASS_DESC]));
4436 get_string(3, className, charsmax(className));
4437
4438 codPromotion[CLASS_PROMOTION] = get_class_id(className);
4439
4440 if (!codPromotion[CLASS_PROMOTION]) return PLUGIN_CONTINUE;
4441
4442 new codClass[classInfo];
4443
4444 ArrayGetArray(codClasses, codPromotion[CLASS_PROMOTION], codClass);
4445
4446 codPromotion[CLASS_LEVEL] = get_param(4);
4447 codPromotion[CLASS_DEGREE] = get_param(5);
4448
4449 codPromotion[CLASS_WEAPONS] = get_param(6) == NONE ? codClass[CLASS_WEAPONS] : get_param(6);
4450 codPromotion[CLASS_HEAL] = get_param(7) == NONE ? codClass[CLASS_HEAL] : get_param(7);
4451 codPromotion[CLASS_INT] = get_param(8) == NONE ? codClass[CLASS_INT] : get_param(8);
4452 codPromotion[CLASS_STR] = get_param(9) == NONE ? codClass[CLASS_STR] : get_param(9);
4453 codPromotion[CLASS_STAM] = get_param(10) == NONE ? codClass[CLASS_STAM] : get_param(10);
4454 codPromotion[CLASS_COND] = get_param(11) == NONE ? codClass[CLASS_COND] : get_param(11);
4455 codPromotion[CLASS_FLAG] = get_param(12) == NONE ? codClass[CLASS_FLAG] : get_param(12);
4456
4457 ArrayPushArray(codPromotions, codPromotion);
4458
4459 return ArraySize(codPromotions) - 1;
4460}
4461
4462stock get_exp_bonus(id, exp)
4463{
4464 new Float:bonus = 1.0;
4465
4466 if (cod_get_user_vip(id)) bonus += 0.25;
4467
4468 if (nightExp) bonus += 1.0;
4469
4470 bonus += floatmin(codPlayer[id][PLAYER_KS] * 0.2, 1.0);
4471 bonus += get_players_amount() * 0.1;
4472
4473 return exp == NONE ? floatround((bonus - 1.0) * 100) : floatround(exp * bonus);
4474}
4475
4476stock get_players_amount()
4477{
4478 if (get_maxplayers() - playersNum <= cvarMinBonusPlayers) return (cvarMinBonusPlayers - (get_maxplayers() - playersNum));
4479
4480 return 0;
4481}
4482
4483stock check_promotion(id, info = 0, class = 0)
4484{
4485 if (!class && codPlayer[id][PLAYER_PROMOTION] == PROMOTION_THIRD) return codPlayer[id][PLAYER_PROMOTION];
4486
4487 new codPromotion[classInfo], promotionId, promotion;
4488
4489 for (new i = 0; i < ArraySize(codPromotions); i++) {
4490 ArrayGetArray(codPromotions, i, codPromotion);
4491
4492 if (codPromotion[CLASS_PROMOTION] == (class ? class : codPlayer[id][PLAYER_CLASS]) && codPlayer[id][PLAYER_LEVEL] >= codPromotion[CLASS_LEVEL]) {
4493 promotionId = i;
4494 promotion = codPromotion[CLASS_DEGREE];
4495 }
4496 }
4497
4498 if (promotion > codPlayer[id][PLAYER_PROMOTION]) {
4499 codPlayer[id][PLAYER_PROMOTION] = promotion;
4500 codPlayer[id][PLAYER_PROMOTION_ID] = promotionId;
4501
4502 if (info) {
4503 new className[MAX_NAME];
4504
4505 codPlayer[id][PLAYER_NEW_CLASS] = codPlayer[id][PLAYER_CLASS];
4506
4507 get_user_class_info(id, codPlayer[id][PLAYER_CLASS], CLASS_NAME, className, charsmax(className));
4508
4509 set_dhudmessage(0, 255, 34, -1.0, 0.45, 0, 0.0, 2.5, 0.0, 0.0);
4510 show_dhudmessage(id, "Awansowales! Twoja klasa to teraz %s!", className);
4511 }
4512 }
4513
4514 return promotion;
4515}
4516
4517stock check_fraction(const fractionName[])
4518{
4519 new tempFactionName[MAX_NAME], bool:foundFraction;
4520
4521 for (new i = 0; i < ArraySize(codFractions); i++) {
4522 ArrayGetString(codFractions, i, tempFactionName, charsmax(tempFactionName));
4523
4524 if (equali(tempFactionName, fractionName)) foundFraction = true;
4525 }
4526
4527 if (!foundFraction) ArrayPushString(codFractions, fractionName);
4528}
4529
4530stock get_weapons(weapons)
4531{
4532 new weaponsList[128], weaponName[22];
4533
4534 for (new i = 1, j = 1; i <= 32; i++) {
4535 if ((1<<i) & weapons) {
4536 get_weaponname(i, weaponName, charsmax(weaponName));
4537
4538 replace_all(weaponName, charsmax(weaponName), "weapon_", "");
4539
4540 if (equal(weaponName, "hegrenade")) weaponName = "he";
4541 if (equal(weaponName, "flashbang")) weaponName = "flash";
4542 if (equal(weaponName, "smokegrenade")) weaponName = "smoke";
4543
4544 strtoupper(weaponName);
4545
4546 if (j > 1) add(weaponsList, charsmax(weaponsList), ", ");
4547
4548 add(weaponsList, charsmax(weaponsList), weaponName);
4549
4550 j++;
4551 }
4552 }
4553
4554 return weaponsList;
4555}
4556
4557stock calculate_left(id, type)
4558{
4559 codPlayer[id][type][ALL] = 0;
4560
4561 if (type == PLAYER_TELEPORTS) {
4562 for (new i = CLASS; i <= ROUND; i++) {
4563 if (codPlayer[id][PLAYER_TELEPORTS][i] == FULL) {
4564 codPlayer[id][PLAYER_TELEPORTS][ALL] = FULL;
4565
4566 break;
4567 } else codPlayer[id][PLAYER_TELEPORTS][ALL] += codPlayer[id][PLAYER_TELEPORTS][i];
4568 }
4569
4570 codPlayer[id][PLAYER_TELEPORTS][ALL] = codPlayer[id][PLAYER_TELEPORTS][ALL] == FULL ? FULL : max(0, codPlayer[id][PLAYER_TELEPORTS][ALL] - codPlayer[id][PLAYER_TELEPORTS][USED]);
4571 } else {
4572 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][type][ALL] += codPlayer[id][type][i];
4573
4574 codPlayer[id][type][ALL] = max(0, codPlayer[id][type][ALL] - codPlayer[id][type][USED]);
4575 }
4576}
4577
4578stock calculate_rockets_left(id)
4579{
4580 codPlayer[id][PLAYER_ROCKETS][ALL] = 0;
4581
4582 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][PLAYER_ROCKETS][ALL] += codPlayer[id][PLAYER_ROCKETS][i];
4583
4584 codPlayer[id][PLAYER_ROCKETS][ALL] = max(0, codPlayer[id][PLAYER_ROCKETS][ALL] - codPlayer[id][PLAYER_ROCKETS][USED]);
4585}
4586
4587stock calculate_mines_left(id)
4588{
4589 codPlayer[id][PLAYER_MINES][ALL] = 0;
4590
4591 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][PLAYER_MINES][ALL] += codPlayer[id][PLAYER_MINES][i];
4592
4593 codPlayer[id][PLAYER_MINES][ALL] = max(0, codPlayer[id][PLAYER_MINES][ALL] - codPlayer[id][PLAYER_MINES][USED]);
4594}
4595
4596stock calculate_dynamites_left(id)
4597{
4598 codPlayer[id][PLAYER_DYNAMITES][ALL] = 0;
4599
4600 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][PLAYER_DYNAMITES][ALL] += codPlayer[id][PLAYER_DYNAMITES][i];
4601
4602 codPlayer[id][PLAYER_DYNAMITES][ALL] = max(0, codPlayer[id][PLAYER_DYNAMITES][ALL] - codPlayer[id][PLAYER_DYNAMITES][USED]);
4603}
4604
4605stock calculate_thunders_left(id)
4606{
4607 codPlayer[id][PLAYER_THUNDERS][ALL] = 0;
4608
4609 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][PLAYER_THUNDERS][ALL] += codPlayer[id][PLAYER_THUNDERS][i];
4610
4611 codPlayer[id][PLAYER_THUNDERS][ALL] = max(0, codPlayer[id][PLAYER_THUNDERS][ALL] - codPlayer[id][PLAYER_THUNDERS][USED]);
4612}
4613
4614stock calculate_medkits_left(id)
4615{
4616 codPlayer[id][PLAYER_MEDKITS][ALL] = 0;
4617
4618 for (new i = CLASS; i <= ROUND; i++) codPlayer[id][PLAYER_MEDKITS][ALL] += codPlayer[id][PLAYER_MEDKITS][i];
4619
4620 codPlayer[id][PLAYER_MEDKITS][ALL] = max(0, codPlayer[id][PLAYER_MEDKITS][ALL] - codPlayer[id][PLAYER_MEDKITS][USED]);
4621}
4622
4623stock calculate_teleports_left(id)
4624{
4625 codPlayer[id][PLAYER_TELEPORTS][ALL] = 0;
4626
4627 for (new i = CLASS; i <= ROUND; i++) {
4628 if (codPlayer[id][PLAYER_TELEPORTS][i] == FULL) {
4629 codPlayer[id][PLAYER_TELEPORTS][ALL] = FULL;
4630
4631 break;
4632 } else codPlayer[id][PLAYER_TELEPORTS][ALL] += codPlayer[id][PLAYER_TELEPORTS][i];
4633 }
4634
4635 codPlayer[id][PLAYER_TELEPORTS][ALL] = codPlayer[id][PLAYER_TELEPORTS][ALL] == FULL ? FULL : max(0, codPlayer[id][PLAYER_TELEPORTS][ALL] - codPlayer[id][PLAYER_TELEPORTS][USED]);
4636}
4637
4638stock execute_forward_ignore(forwardHandle)
4639{
4640 static ret;
4641
4642 return ExecuteForward(forwardHandle, ret);
4643}
4644
4645stock execute_forward_ignore_one_param(forwardHandle, param)
4646{
4647 static ret;
4648
4649 return ExecuteForward(forwardHandle, ret, param);
4650}
4651
4652stock execute_forward_ignore_two_params(forwardHandle, paramOne, paramTwo)
4653{
4654 static ret;
4655
4656 return ExecuteForward(forwardHandle, ret, paramOne, paramTwo);
4657}
4658
4659stock execute_forward_ignore_three_params(forwardHandle, paramOne, paramTwo, paramThree)
4660{
4661 static ret;
4662
4663 return ExecuteForward(forwardHandle, ret, paramOne, paramTwo, paramThree);
4664}
4665
4666stock get_class_info(class, info, dataReturn[] = "", dataLength = 0)
4667{
4668 new codClass[classInfo];
4669
4670 ArrayGetArray(codClasses, class, codClass);
4671
4672 if (info == CLASS_NAME || info == CLASS_DESC || info == CLASS_FRACTION) {
4673 copy(dataReturn, dataLength, codClass[info]);
4674
4675 return 0;
4676 }
4677
4678 return codClass[info];
4679}
4680
4681stock get_class_id(className[])
4682{
4683 static codClass[classInfo];
4684
4685 for (new i = 1; i < ArraySize(codClasses); i++) {
4686 ArrayGetArray(codClasses, i, codClass);
4687
4688 if (equali(codClass[CLASS_NAME], className)) return i;
4689 }
4690
4691 return 0;
4692}
4693
4694stock get_item_info(item, info, dataReturn[] = "", dataLength = 0)
4695{
4696 static codItem[itemInfo];
4697
4698 ArrayGetArray(codItems, item, codItem);
4699
4700 if (info == ITEM_NAME || info == ITEM_DESC) {
4701 copy(dataReturn, dataLength, codItem[info]);
4702
4703 return 0;
4704 }
4705
4706 return codItem[info];
4707}
4708
4709stock get_promotion_info(promotion, info, dataReturn[] = "", dataLength = 0)
4710{
4711 static codPromotion[classInfo];
4712
4713 ArrayGetArray(codPromotions, promotion, codPromotion);
4714
4715 if (info == CLASS_NAME || info == CLASS_DESC) {
4716 copy(dataReturn, dataLength, codPromotion[info]);
4717
4718 return 0;
4719 }
4720
4721 return codPromotion[info];
4722}
4723
4724stock get_class_promotion_info(class, promotion, info, dataReturn[] = "", dataLength = 0)
4725{
4726 static codPromotion[classInfo];
4727
4728 for (new i = 0; i < ArraySize(codPromotions); i++) {
4729 ArrayGetArray(codPromotions, i, codPromotion);
4730
4731 if (codPromotion[CLASS_PROMOTION] == class && codPromotion[CLASS_DEGREE] == promotion) {
4732 if (info == CLASS_PROMOTION) return i;
4733
4734 if (info == CLASS_NAME || info == CLASS_DESC) {
4735 copy(dataReturn, dataLength, codPromotion[info]);
4736
4737 return 0;
4738 }
4739
4740 return codPromotion[info];
4741 }
4742 }
4743
4744 return 0;
4745}
4746
4747stock find_class_promotion(class, promotion = PROMOTION_NONE)
4748{
4749 new classPromotion = PROMOTION_NONE;
4750
4751 static codPromotion[classInfo];
4752
4753 for (new i = 0; i < ArraySize(codPromotions); i++) {
4754 ArrayGetArray(codPromotions, i, codPromotion);
4755
4756 if (codPromotion[CLASS_PROMOTION] == class && codPromotion[CLASS_DEGREE] > classPromotion && codPromotion[CLASS_DEGREE] > promotion) return classPromotion = codPromotion[CLASS_DEGREE];
4757 }
4758
4759 return classPromotion;
4760}
4761
4762stock get_user_class_info(id, class, info, dataReturn[] = "", dataLength = 0)
4763 return codPlayer[id][PLAYER_PROMOTION] ? get_promotion_info(codPlayer[id][PLAYER_PROMOTION_ID], info, dataReturn, dataLength) : get_class_info(class, info, dataReturn, dataLength);
4764
4765stock clear_render(id)
4766 for (new i = CLASS; i <= ROUND; i++) remove_render_type(id, i);
4767
4768stock remove_render_type(id, type)
4769{
4770 static codRender[renderInfo];
4771
4772 for (new i = 0; i < ArraySize(codPlayerRender[id]); i++) {
4773 ArrayGetArray(codPlayerRender[id], i, codRender);
4774
4775 if (codRender[RENDER_TYPE] == type)
4776 {
4777 if (type == ROUND) ArrayDeleteItem(codPlayerRender[id], i);
4778 else {
4779 codRender[RENDER_VALUE] = 256;
4780 codRender[RENDER_STATUS] = 0;
4781 codRender[RENDER_WEAPON] = 0;
4782
4783 ArraySetArray(codPlayerRender[id], i, codRender);
4784 }
4785 }
4786 }
4787
4788 render_change(id);
4789}
4790
4791stock make_explosion(ent, distance = 0, explosion = 1, Float:damage_distance = 0.0, Float:damage = 0.0, Float:factor = 0.5, suicide = 0, type = NONE)
4792{
4793 new Float:tempOrigin[3], origin[3], id;
4794
4795 if (is_user_valid(ent)) id = ent;
4796 else id = entity_get_edict(ent, EV_ENT_owner);
4797
4798 entity_get_vector(ent, EV_VEC_origin, tempOrigin);
4799
4800 for (new i = 0; i < 3; i++) origin[i] = floatround(tempOrigin[i]);
4801
4802 if (explosion) {
4803 message_begin(MSG_BROADCAST, SVC_TEMPENTITY, origin);
4804 write_byte(TE_EXPLOSION);
4805 write_coord(origin[0]);
4806 write_coord(origin[1]);
4807 write_coord(origin[2]);
4808 write_short(codSprite[SPRITE_EXPLOSION]);
4809 write_byte(32);
4810 write_byte(20);
4811 write_byte(0);
4812 message_end();
4813 }
4814
4815 if (distance) {
4816 message_begin(MSG_BROADCAST, SVC_TEMPENTITY, origin);
4817 write_byte(TE_BEAMCYLINDER);
4818 write_coord(origin[0]);
4819 write_coord(origin[1]);
4820 write_coord(origin[2]);
4821 write_coord(origin[0]);
4822 write_coord(origin[1] + distance);
4823 write_coord(origin[2] + distance);
4824 write_short(codSprite[SPRITE_WHITE]);
4825 write_byte(0);
4826 write_byte(0);
4827 write_byte(10);
4828 write_byte(10);
4829 write_byte(255);
4830 write_byte(255);
4831 write_byte(100);
4832 write_byte(100);
4833 write_byte(128);
4834 write_byte(0);
4835 message_end();
4836 }
4837
4838 if (damage_distance > 0.0) {
4839 new entList[33], foundPlayers = find_sphere_class(ent, "player", damage_distance, entList, MAX_PLAYERS), player, ret;
4840
4841 for (new i = 0; i < foundPlayers; i++) {
4842 player = entList[i];
4843
4844 if (!is_user_alive(player) || (damage < 0.0 && get_user_team(id) != get_user_team(player)) || (damage > 0.0 && (get_user_team(id) == get_user_team(player) || codPlayer[player][PLAYER_RESISTANCE][ALL]))) continue;
4845
4846 if (type != NONE) {
4847 ExecuteForward(codForwards[type], ret, id, player, floatabs(damage) + get_intelligence(id) * factor);
4848
4849 if (float(ret) == COD_BLOCK) continue;
4850
4851 switch(type) {
4852 case MEDKIT_HEAL: codPlayer[id][PLAYER_LAST_MEDKIT] += ret;
4853 case MINE_EXPLODE: codPlayer[id][PLAYER_LAST_MINE] += ret;
4854 case ROCKET_EXPLODE: codPlayer[id][PLAYER_LAST_ROCKET] += ret;
4855 case DYNAMITE_EXPLODE: codPlayer[id][PLAYER_LAST_DYNAMITE] += ret;
4856 }
4857 }
4858
4859 if (damage < 0.0) cod_add_user_health(player, floatround(floatabs(damage) + codPlayer[id][PLAYER_INT] * factor), 1);
4860 else cod_inflict_damage(id, player, damage, factor, DMG_CODSKILL);
4861 }
4862 }
4863
4864 if (suicide) user_silentkill(id);
4865}
4866
4867stock make_bar_timer(id, duration = 0, start = 0)
4868{
4869 if (!is_user_alive(id)) return;
4870
4871 static msgBartimer;
4872
4873 if (!msgBartimer) msgBartimer = get_user_msgid("BarTime2");
4874
4875 message_begin(id ? MSG_ONE : MSG_ALL, msgBartimer, _, id);
4876 write_short(duration);
4877 write_short(start);
4878 message_end();
4879}
4880
4881stock chat_print(id, const text[], any:...)
4882{
4883 new message[192];
4884
4885 if (numargs() == 2) copy(message, charsmax(message), text);
4886 else vformat(message, charsmax(message), text, 3);
4887
4888 client_print_color(id, id, "^x04[Deathrun]^x01 %s", message);
4889}
4890
4891stock show_hud(id, const text[], type=0, red=255, green=255, blue=255, Float:x=-1.0, Float:y=0.35, effects=0, Float:fxtime=6.0, Float:holdtime=12.0, Float:fadeintime=0.1, Float:fadeouttime=0.2)
4892{
4893 if (!is_user_connected(id)) return;
4894
4895 if (type) {
4896 set_dhudmessage(red, green, blue, x, y, effects, fxtime, holdtime, fadeintime, fadeouttime);
4897 show_dhudmessage(id, text);
4898 } else {
4899 static counter;
4900
4901 if (++counter > 1) counter = 0;
4902
4903 set_hudmessage(red, green, blue, x, y, effects, fxtime, holdtime, fadeintime, fadeouttime);
4904 ShowSyncHudMsg(id, counter ? hudSync2 : hudSync, text);
4905 }
4906}
4907
4908stock cmd_execute(id, const text[], any:...)
4909{
4910 #pragma unused text
4911
4912 new message[192];
4913
4914 format_args(message, charsmax(message), 1);
4915
4916 message_begin(id == 0 ? MSG_ALL : MSG_ONE, SVC_DIRECTOR, _, id);
4917 write_byte(strlen(message) + 2);
4918 write_byte(10);
4919 write_string(message);
4920 message_end();
4921}
4922
4923stock sql_string(const source[], dest[], length)
4924{
4925 copy(dest, length, source);
4926
4927 replace_all(dest, length, "\\", "\\\\");
4928 replace_all(dest, length, "\0", "\\0");
4929 replace_all(dest, length, "\n", "\\n");
4930 replace_all(dest, length, "\r", "\\r");
4931 replace_all(dest, length, "\x1a", "\Z");
4932 replace_all(dest, length, "'", "\'");
4933 replace_all(dest, length, "`", "\`");
4934 replace_all(dest, length, "^"", "\^"");
4935}
4936
4937stock display_fade(id, duration, holdtime, fadetype, red, green, blue, alpha)
4938{
4939 if (!is_user_alive(id)) return;
4940
4941 static msgScreenFade;
4942
4943 if (!msgScreenFade) msgScreenFade = get_user_msgid("ScreenFade");
4944
4945 message_begin(MSG_ONE, msgScreenFade, {0, 0, 0}, id);
4946 write_short(duration);
4947 write_short(holdtime);
4948 write_short(fadetype);
4949 write_byte(red);
4950 write_byte(green);
4951 write_byte(blue);
4952 write_byte(alpha);
4953 message_end();
4954}
4955
4956stock screen_shake(id, amplitude, duration, frequency)
4957{
4958 if (!is_user_alive(id)) return;
4959
4960 static msgScreenShake;
4961
4962 if (!msgScreenShake) msgScreenShake = get_user_msgid("ScreenShake");
4963
4964 message_begin(MSG_ONE, msgScreenShake, {0, 0, 0}, id);
4965 write_short(amplitude);
4966 write_short(duration);
4967 write_short(frequency);
4968 message_end();
4969}
4970
4971stock set_user_clip(id)
4972{
4973 if (!is_user_alive(id)) return;
4974
4975 new weaponName[32], weaponid = -1, weapon = codPlayer[id][PLAYER_WEAPON];
4976
4977 get_weaponname(weapon, weaponName, charsmax(weaponName));
4978
4979 while ((weaponid = engfunc(EngFunc_FindEntityByString, weaponid, "classname", weaponName)) != 0) {
4980 if (pev(weaponid, pev_owner) == id) set_pdata_int(weaponid, 51, maxClipAmmo[weapon], 4);
4981 }
4982}
4983
4984stock get_loguser_index()
4985{
4986 new userLog[96], userName[32];
4987
4988 read_logargv(0, userLog, charsmax(userLog));
4989
4990 parse_loguser(userLog, userName, charsmax(userName));
4991
4992 return get_user_index(userName);
4993}
4994
4995stock cs_get_weaponbox_type(weaponTypeBox)
4996{
4997 new weaponType, weaponBox[6] = { 34 , 35 , ... };
4998
4999 for (new i = 1; i <= 5; i++) {
5000 weaponType = get_pdata_cbase(weaponTypeBox, weaponBox[i], 4);
5001
5002 if (weaponType > 0) return cs_get_weapon_id(weaponType);
5003 }
5004
5005 return 0;
5006}
5007
5008stock strip_weapons(id, type, bool:switchIfActive = true)
5009{
5010 if (is_user_alive(id))
5011 {
5012 new ent, weapon;
5013
5014 while ((weapon = get_weapon_from_slot(id, type, ent)) > 0) ham_strip_user_weapon(id, weapon, type, switchIfActive);
5015 }
5016}
5017
5018stock get_weapon_from_slot(id, slot, &ent)
5019{
5020 if (!(1 <= slot <= 5)) return 0;
5021
5022 ent = get_pdata_cbase(id, 367 + slot , 5);
5023
5024 return (ent > 0) ? get_pdata_int(ent, 43 , 4) : 0;
5025}
5026
5027stock ham_strip_user_weapon(id, weaponId, slot = 0, bool:switchIfActive = true)
5028{
5029 static const weaponsSlots[] = { -1, 2, -1, 1, 4, 1, 5, 1, 1, 4, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 3, 1 };
5030
5031 new weapon;
5032
5033 if (!slot) slot = weaponsSlots[weaponId];
5034
5035 weapon = get_pdata_cbase(id, 367 + slot, 5);
5036
5037 while (weapon > 0) {
5038 if (get_pdata_int(weapon, 43, 4) == weaponId) break;
5039
5040 weapon = get_pdata_cbase(weapon, 42, 4);
5041 }
5042
5043 if (weapon > 0) {
5044 if (switchIfActive && get_pdata_cbase(id, 373, 5) == weapon) ExecuteHamB(Ham_Weapon_RetireWeapon, weapon);
5045
5046 if (ExecuteHamB(Ham_RemovePlayerItem, id, weapon)) {
5047 user_has_weapon(id, weaponId, 0);
5048
5049 ExecuteHamB(Ham_Item_Kill, weapon);
5050
5051 return 1;
5052 }
5053 }
5054
5055 return 0;
5056}
5057
5058stock bool:is_enough_space(ent, Float:limit = 120.0)
5059{
5060 new Float:origin[3], Float:start[3], Float:end[3];
5061
5062 pev(ent, pev_origin, origin);
5063
5064 start[0] = end[0] = origin[0];
5065 start[1] = end[1] = origin[1];
5066 start[2] = end[2] = origin[2];
5067
5068 start[0] += limit;
5069 end[0] -= limit;
5070
5071 if (engfunc(EngFunc_PointContents, start) != CONTENTS_EMPTY && engfunc(EngFunc_PointContents, end) != CONTENTS_EMPTY) return false;
5072
5073 start[0] -= limit;
5074 end[0] += limit;
5075 start[1] += limit;
5076 end[1] -= limit;
5077
5078 if (engfunc(EngFunc_PointContents, start) != CONTENTS_EMPTY && engfunc(EngFunc_PointContents, end) != CONTENTS_EMPTY) return false;
5079
5080 return true;
5081}
5082
5083stock check_if_player_stuck(id)
5084{
5085 if (!is_user_alive(id)) return PLUGIN_HANDLED;
5086
5087 new Float:origin[3];
5088
5089 pev(id, pev_origin, origin);
5090
5091 if (!is_hull_vacant(origin, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id) && !get_user_noclip(id) && !(pev(id, pev_solid) & SOLID_NOT)) unstuck_player(id);
5092
5093 return PLUGIN_HANDLED;
5094}
5095
5096stock unstuck_player(id)
5097{
5098 enum coords { Float:x, Float:y, Float:z };
5099
5100 static Float:originalOrigin[coords], Float:newOrigin[coords];
5101 static attempts, distance;
5102
5103 pev(id, pev_origin, originalOrigin);
5104
5105 distance = 32;
5106
5107 while (distance < 1000) {
5108 attempts = 128;
5109
5110 while (attempts--) {
5111 newOrigin[x] = random_float(originalOrigin[x] - distance, originalOrigin[x] + distance);
5112 newOrigin[y] = random_float(originalOrigin[y] - distance, originalOrigin[y] + distance);
5113 newOrigin[z] = random_float(originalOrigin[z] - distance, originalOrigin[z] + distance);
5114
5115 engfunc(EngFunc_TraceHull, newOrigin, newOrigin, DONT_IGNORE_MONSTERS, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id, 0);
5116
5117 if (get_tr2(0, TR_InOpen) && !get_tr2(0, TR_AllSolid) && !get_tr2(0, TR_StartSolid)) {
5118 engfunc(EngFunc_SetOrigin, id, newOrigin);
5119
5120 return;
5121 }
5122 }
5123
5124 distance += 32;
5125 }
5126}
5127
5128stock bool:is_hull_vacant(const Float:origin[3], hull, id)
5129{
5130 static trace;
5131
5132 engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, trace);
5133
5134 if (!get_tr2(trace, TR_StartSolid) || !get_tr2(trace, TR_AllSolid)) return true;
5135
5136 return false;
5137}
5138
5139stock const spawnEntString[2][] = {"info_player_start", "info_player_deathmatch"}
5140
5141stock find_free_spawn(team, Float:spawnOrigin[3], Float:spawnAngle[3])
5142{
5143 const maxSpawns = 128;
5144
5145 new spawnPoints[maxSpawns], bool:spawnChecked[maxSpawns], entList[1], spawnPoint, spawnNum, ent = -1, spawnsFound = 0, i;
5146
5147 while ((ent = find_ent_by_class(ent, spawnEntString[team == 2 ? 0 : 1])) && spawnsFound < maxSpawns) spawnPoints[spawnsFound++] = ent;
5148
5149 for (i = 0; i < maxSpawns; i++) spawnChecked[i] = false;
5150
5151 i = 0;
5152
5153 while (i++ < spawnsFound * 10) {
5154 spawnNum = random(spawnsFound);
5155 spawnPoint = spawnPoints[spawnNum];
5156
5157 if (spawnPoint && !spawnChecked[spawnNum]) {
5158 spawnChecked[spawnNum] = true;
5159
5160 pev(spawnPoint, pev_origin, spawnOrigin);
5161
5162 if (!find_sphere_class(0, "player", 100.0, entList, sizeof entList, spawnOrigin)) {
5163 pev(spawnPoint, pev_angles, spawnAngle);
5164
5165 return spawnPoint;
5166 }
5167 }
5168 }
5169
5170 return 0;
5171}