Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <amxmodx>
- #include <cstrike>
- #include <fakemeta>
- #include <hamsandwich>
- #include <nvault>
- #include <engine>
- #define PLUGIN "Custom USP Shop Ultimate Optimized"
- #define VERSION "1.3"
- #define AUTHOR "Ariel - CheezPuff"
- #define m_pPlayer 41
- #define m_flAccuracy 108
- #define MAX_PLAYERS 32
- #define TASK_SHOWHUD 1000
- enum {
- USP_DEFAULT,
- USP_SILENCER,
- USP_MATCH,
- USP_EXPERT,
- USP_GUARDIAN,
- MAX_USP_MODELS
- }
- new const g_usp_names[MAX_USP_MODELS][] = { "Default USP", "USP Silencer", "USP Match", "USP Expert", "USP Guardian" }
- new const g_usp_models[MAX_USP_MODELS][] = { "models/v_usp.mdl", "models/v_usp_silencer.mdl", "models/v_usp_match.mdl", "models/v_usp_expert.mdl", "models/v_usp_guardian.mdl" }
- new const g_usp_prices[MAX_USP_MODELS] = { 0, 1000, 2000, 3000, 4000 }
- // Stats
- new const g_usp_damage_base[MAX_USP_MODELS] = { 34, 35, 35, 36, 37 }
- new const g_usp_accuracy_base[MAX_USP_MODELS] = { 65, 68, 70, 72, 75 }
- new const g_usp_recoil_text[MAX_USP_MODELS][] = { "High", "Medium", "Medium", "Low", "Very Low" }
- new const g_usp_firerate_base[MAX_USP_MODELS] = { 380, 390, 400, 410, 420 }
- new g_player_usp_model[MAX_PLAYERS + 1], g_player_usp_level[MAX_PLAYERS + 1]
- new g_player_cash[MAX_PLAYERS + 1], g_player_xp[MAX_PLAYERS + 1]
- new const g_upgrade_costs[] = { 500, 1000, 1500, 2000, 2500 }
- new g_vault, g_HudSync
- public plugin_init() {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- register_clcmd("say /uspshop", "cmd_usp_shop")
- RegisterHam(Ham_Item_Deploy, "weapon_usp", "fw_USPDeploy_Post", 1)
- RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
- RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_usp", "fw_WeaponPrimaryAttack_Post", 1)
- register_event("DeathMsg", "event_death", "a")
- g_vault = nvault_open("usp_shop_data")
- g_HudSync = CreateHudSyncObj()
- set_task(1.0, "update_hud_global", TASK_SHOWHUD, .flags = "b")
- }
- public plugin_precache() {
- for (new i = 0; i < MAX_USP_MODELS; i++) precache_model(g_usp_models[i])
- }
- public client_putinserver(id) {
- load_player_data(id)
- }
- public client_disconnected(id) {
- save_player_data(id)
- }
- public cmd_usp_shop(id) {
- if (!is_user_alive(id)) {
- client_print_color(id, print_team_default, "^4[USP Shop] ^1You must be alive to use the shop.")
- return PLUGIN_HANDLED
- }
- show_usp_models_menu(id)
- return PLUGIN_HANDLED
- }
- public show_usp_models_menu(id) {
- static szTitle[64], szItem[64], szData[4];
- formatex(szTitle, charsmax(szTitle), "\yUSP Shop^n\wYour Cash: \r$%d^n", g_player_cash[id])
- new menu = menu_create(szTitle, "menu_handler_models")
- for (new i = 0; i < MAX_USP_MODELS; i++) {
- formatex(szItem, charsmax(szItem), "%s \y[$%d]", g_usp_names[i], g_usp_prices[i])
- formatex(szData, charsmax(szData), "%d", i)
- menu_additem(menu, szItem, szData)
- }
- menu_display(id, menu, 0)
- }
- public menu_handler_models(id, menu, item) {
- if (item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; }
- static szData[6]; menu_item_getinfo(menu, item, _, szData, charsmax(szData))
- show_usp_details(id, str_to_num(szData))
- menu_destroy(menu); return PLUGIN_HANDLED
- }
- public show_usp_details(id, model) {
- static szTitle[64], szItem[64], szData[16];
- formatex(szTitle, charsmax(szTitle), "\yViewing: \w%s^n", g_usp_names[model])
- new menu = menu_create(szTitle, "menu_handler_usp_details")
- formatex(szItem, charsmax(szItem), "\wYour Cash: \y$%d", g_player_cash[id])
- menu_additem(menu, szItem, "none")
- formatex(szItem, charsmax(szItem), "\wUSP Price: \y$%d^n", g_usp_prices[model])
- menu_additem(menu, szItem, "none")
- formatex(szData, charsmax(szData), "stats_%d", model)
- menu_additem(menu, "\wView USP Stats", szData)
- if (g_player_usp_model[id] == model) {
- if (g_player_usp_level[id] < 5) {
- formatex(szItem, charsmax(szItem), "\wUpgrade [\y$%d\w]", g_upgrade_costs[g_player_usp_level[id]])
- formatex(szData, charsmax(szData), "upgrade_%d", model)
- menu_additem(menu, szItem, szData)
- } else {
- menu_additem(menu, "\dMaximum Level Reached", "none")
- }
- } else {
- formatex(szData, charsmax(szData), "buy_%d", model)
- menu_additem(menu, "\rPurchase", szData)
- }
- menu_display(id, menu, 0)
- }
- public menu_handler_usp_details(id, menu, item) {
- if (item == MENU_EXIT) { menu_destroy(menu); show_usp_models_menu(id); return PLUGIN_HANDLED; }
- static szData[20]; menu_item_getinfo(menu, item, _, szData, charsmax(szData))
- if (contain(szData, "stats_") != -1) {
- show_usp_abilities(id, str_to_num(szData[6]))
- } else if (contain(szData, "buy_") != -1) {
- purchase_usp(id, str_to_num(szData[4]))
- } else if (contain(szData, "upgrade_") != -1) {
- upgrade_usp(id)
- }
- menu_destroy(menu); return PLUGIN_HANDLED
- }
- public show_usp_abilities(id, model) {
- static szTitle[64], szItem[64], szData[4];
- new level = (g_player_usp_model[id] == model) ? g_player_usp_level[id] : 0
- formatex(szTitle, charsmax(szTitle), "\y%s \w- Stats (Lvl %d)^n", g_usp_names[model], level)
- new menu = menu_create(szTitle, "menu_handler_back")
- formatex(szItem, charsmax(szItem), "\wDamage: \y%d", g_usp_damage_base[model] + (level * 2))
- menu_additem(menu, szItem)
- formatex(szItem, charsmax(szItem), "\wAccuracy: \y%d%%", g_usp_accuracy_base[model] + (level * 2))
- menu_additem(menu, szItem)
- formatex(szItem, charsmax(szItem), "\wRecoil: \y%s", g_usp_recoil_text[model])
- menu_additem(menu, szItem)
- formatex(szItem, charsmax(szItem), "\wFire Rate: \y%d RPM", g_usp_firerate_base[model] + (level * 10))
- menu_additem(menu, szItem)
- formatex(szItem, charsmax(szItem), "\wWall Bang: \y%s^n", (level >= 3) ? "\rEnabled" : "\dDisabled")
- menu_additem(menu, szItem)
- formatex(szData, charsmax(szData), "%d", model)
- menu_additem(menu, "\yBack", szData)
- menu_display(id, menu, 0)
- }
- public menu_handler_back(id, menu, item) {
- if (item != MENU_EXIT) {
- static szData[6]; menu_item_getinfo(menu, item, _, szData, charsmax(szData))
- show_usp_details(id, str_to_num(szData))
- }
- menu_destroy(menu); return PLUGIN_HANDLED
- }
- // --- Logic ---
- public purchase_usp(id, model) {
- if (g_player_cash[id] < g_usp_prices[model]) {
- client_print_color(id, print_team_default, "^4[USP Shop] ^1Not enough cash!");
- return
- }
- g_player_cash[id] -= g_usp_prices[model]
- g_player_usp_model[id] = model
- g_player_usp_level[id] = 0
- if (get_user_weapon(id) == CSW_USP) set_pev(id, pev_viewmodel2, g_usp_models[model])
- client_print_color(id, print_team_default, "^4[USP Shop] ^1Purchased ^3%s^1!", g_usp_names[model])
- }
- public upgrade_usp(id) {
- new level = g_player_usp_level[id]
- if (level >= 5 || g_player_cash[id] < g_upgrade_costs[level]) return
- g_player_cash[id] -= g_upgrade_costs[level]
- g_player_usp_level[id]++
- client_print_color(id, print_team_default, "^4[USP Shop] ^1Upgraded to Level ^3%d^1!", g_player_usp_level[id])
- }
- public fw_USPDeploy_Post(weapon_ent) {
- new id = get_pdata_cbase(weapon_ent, m_pPlayer, 4)
- if (is_user_connected(id)) set_pev(id, pev_viewmodel2, g_usp_models[g_player_usp_model[id]])
- }
- public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_bits) {
- if (!is_user_connected(attacker) || get_user_weapon(attacker) != CSW_USP) return HAM_IGNORED
- new Float:mult = 1.0 + (float(g_player_usp_model[attacker]) * 0.05) + (float(g_player_usp_level[attacker]) * 0.02)
- SetHamParamFloat(4, damage * mult)
- return HAM_HANDLED
- }
- public fw_WeaponPrimaryAttack_Post(entity) {
- new id = pev(entity, pev_owner)
- set_pdata_float(entity, m_flAccuracy, 1.0 - (float(g_player_usp_level[id]) * 0.05), 4)
- }
- public event_death() {
- new killer = read_data(1)
- if (!is_user_connected(killer)) return
- g_player_cash[killer] += (cs_get_user_team(killer) == CS_TEAM_T) ? 300 : 150
- g_player_xp[killer] += 10
- }
- public update_hud_global() {
- static id, szBuffer[128];
- for (id = 1; id <= MaxClients; id++) {
- if (!is_user_alive(id)) continue
- formatex(szBuffer, charsmax(szBuffer), "Cash: $%d | XP: %d | USP: %s (Lvl %d)",
- g_player_cash[id], g_player_xp[id], g_usp_names[g_player_usp_model[id]], g_player_usp_level[id])
- set_hudmessage(0, 255, 0, 0.02, 0.15, 0, 0.0, 1.1, 0.0, 0.0, -1)
- ShowSyncHudMsg(id, g_HudSync, "%s", szBuffer)
- }
- }
- save_player_data(id) {
- static szAuthid[32], szData[64];
- get_user_authid(id, szAuthid, charsmax(szAuthid))
- formatex(szData, charsmax(szData), "%d %d %d %d", g_player_usp_model[id], g_player_usp_level[id], g_player_cash[id], g_player_xp[id])
- nvault_set(g_vault, szAuthid, szData)
- }
- load_player_data(id) {
- static szAuthid[32], szData[64];
- get_user_authid(id, szAuthid, charsmax(szAuthid))
- if (nvault_get(g_vault, szAuthid, szData, charsmax(szData))) {
- static szM[4], szL[4], szC[12], szX[12]
- parse(szData, szM, charsmax(szM), szL, charsmax(szL), szC, charsmax(szC), szX, charsmax(szX))
- g_player_usp_model[id] = str_to_num(szM)
- g_player_usp_level[id] = str_to_num(szL)
- g_player_cash[id] = str_to_num(szC)
- g_player_xp[id] = str_to_num(szX)
- }
- }
- public plugin_end() nvault_close(g_vault)
Advertisement
Add Comment
Please, Sign In to add comment