Senior Member
Join Date: Dec 2005
Location: Thunderstorm Central
|
06-08-2011
, 09:37
Re: My First Attempt to make a menu! part2
|
#14
|
Quote:
Originally Posted by The Art of War
@G-Dog: Lol, sorry then. I just thought of the exemplary code and the great comments (and in the back of my mind I thought you wrote it) to be your awesome handiwork. Well, again, I'm sorry :p
|
didn't you see part1 of this menu thing? Several of the comments where done by me.
back on topic: read_data is used when you want to retrieve data from game events(when you have register_event blah blah in plugin_init) see http://wiki.amxmodx.org/Half-Life_1_Game_Events for more info on game events. So in this case your read_data in the fw_TakeDamage does nothing. Instead we need to use get_user_weapon. Unfortunately grenade makes this a little more complicated since we would have to add in a way to detect when it explodes(I suggest looking through zombie plague if you want an example of how). Instead of going through the trouble we'll switch to an alternate method of applying extra damage that is easier with grenades.
PHP Code:
// Menu - Basics
#define M3MULT 3.0 // damage multiplier for Ultimate M3 # admin only.
#define HEMULT 4.0 // damage multiplier for Super HE # admin only.
#include <superheromod>
#define AMMOX_HEGRENADE 12
new bool:grenadetrail[SH_MAXSLOTS+1];
new bool:extradmg[SH_MAXSLOTS+1];
new bool:extrafragdmg[SH_MAXSLOTS+1];
new gTrail;
new const itemcost[7] = { 3000, 3000, 4000, 6000, 5000, 0, 0 };
new const HEGrenade[] = "models/w_hegrenade.mdl";
public plugin_init()
{
register_plugin("WeaponMenu", "1.1", "RB");
register_clcmd("say /buy", "cmd_menu");
register_clcmd("say_team /buy", "cmd_menu");
register_event("AmmoX", "super_grenade", "b");
}
public plugin_precache()
{
gTrail = precache_model("sprites/zbeam5.spr");
}
public client_damage(attacker, id, damage, weapon, bodypart) //switching extra damamge methods cause ham module seems a little too complex for you, besides this method is easier to deal with grenade extra damage
{
if ( !sh_is_active() || !is_user_alive(id) || !is_user_connected(attacker) ) return;
new headshot = bodypart == 1 ? 1 : 0
if ( extradmg[attacker] && weapon == CSW_M3 )
{
// do extra damage
new extraDamage = floatround(damage * M3MULT - damage);
if (extraDamage > 0) sh_extra_damage(id, attacker, extraDamage, "Super M3", headshot);
}
if ( extrafragdmg[attacker] && weapon == CSW_HEGRENADE )
{
// do extra damage
new extraDamage = floatround(damage * HEMULT - damage);
if (extraDamage > 0) sh_extra_damage(id, attacker, extraDamage, "grenade", headshot);
extrafragdmg[attacker] = false; //we only want the extra dmg to work on our one nade
}
}
/*======================================================================
DAMAGE MULT OPTIONS
======================================================================*/
public client_disconnect(id)
{
extradmg[id] = false;
extrafragdmg[id] = false;
}
// if the damage mult should dissapear upon the player's death then uncomment this function
public sh_client_death(victim, attacker, headshot, const wpnDescription[])
{
extradmg[victim] = false;
extrafragdmg[victim] = false;
}
/* if the damage mult should only last 1 round then uncomment this function
public sh_round_new()
arrayset(extradmg, false, SH_MAXSLOTS+1);
*/
/*======================================================================
DAMAGE MULT OPTIONS
======================================================================*/
public cmd_menu(id)
{
if ( is_user_alive(id) )
{
new menu = menu_create("Choose Your Weapon Set", "menu_handler");
menu_additem(menu, "/yBuy M4A1 + HE", "0", 0);
menu_additem(menu, "/yBuy AK47 + HE", "1", 0);
menu_additem(menu, "/yBuy AWP + Kevlar", "2", 0);
menu_additem(menu, "/yBuy M249 + Deagle/Flash", "3", 0);
menu_additem(menu, "/yBuy CSW_G3SG1", "4", 0);
new buffer[18]; //allows us to format the color based on admin or not
formatex(buffer, charsmax(buffer), "%sBuy Ultimate M3", (get_user_flags(id) & ADMIN_ADMIN) ? "/y" : "/w");
menu_additem(menu, buffer, "5");
formatex(buffer, charsmax(buffer), "%sBuy Super HE", (get_user_flags(id) & ADMIN_ADMIN) ? "/y" : "/w");
menu_additem(menu, buffer, "6");
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, menu, 0);
} else client_print(id, print_chat, "[AMXX] You Have To Be Alive To Use The Menu(if you want an item meant for a zombie go play a zombie server)."); //this insult brought to you by 1 random guy :P
}
public menu_handler(id, menu, item)
{
if ( item == MENU_EXIT )
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
if ( !is_user_alive(id) ) //in case a player waits till they die and then chooses an option
{
menu_destroy(menu);
client_print(id, print_chat, "[AMXX] Died while looking at the menu eh?");
return PLUGIN_HANDLED;
}
new data[2], acces, callback, key;
menu_item_getinfo(menu, item, acces, data, 1, _, _, callback);
key = str_to_num(data);
if ( 0 <= key < 7 )
{
new usermoney = cs_get_user_money(id);
new cost = itemcost[key];
if ( usermoney >= cost )
{
cs_set_user_money(id, usermoney - cost, 1);
if ( key == 5 ) client_print(id, print_chat, "[AMXX] Bought Ultimate M3(who bought what? oo you used your admin powers you cheating bastard)"); //this insult brought to you by 1 random guy :P
if ( key == 6 ) client_print(id, print_chat, "[AMXX] Bought Super HE(may you forget to throw after pulling the pin)"); //this insult brought to you by 1 random guy :P
else client_print(id, print_chat, "[AMXX] Bought Weapon Set %i", key+1);
switch(key)
{
case 0: // M4A1 + HE
{
sh_give_weapon(id, CSW_M4A1, true);
sh_give_weapon(id, CSW_HEGRENADE);
}
case 1: // AK47 + HE
{
sh_give_weapon(id, CSW_AK47, true);
sh_give_weapon(id, CSW_HEGRENADE);
}
case 2: // AWP + Kevlar
{
sh_give_weapon(id, CSW_AWP, true);
set_user_armor(id, 100);
}
case 3: // M249 + Deagle/Flash
{
sh_give_weapon(id, CSW_M249, true);
sh_give_weapon(id, CSW_DEAGLE);
sh_give_weapon(id, CSW_FLASHBANG);
}
case 4: sh_give_weapon(id, CSW_G3SG1, true); // G3SG1
case 5, 6: //since we are repeating a check between 5 and 6 I just rolled them together
{
if ( !(get_user_flags(id) & ADMIN_ADMIN) )
{
client_print(id, print_chat, "[AMXX] Only the admins get to use this option, cause they're cool(more like they sux)."); //this insult brought to you by 1 random guy :P
menu_destroy(menu);
cmd_menu(id);
return PLUGIN_HANDLED;
}
if ( key == 6 )
{
if ( cs_get_user_bpammo(id, CSW_HEGRENADE) >= 1 ) //get_user_weapon only checks current weapon so instead we check if the user has a nade with this code
{
client_print(id, print_chat, "[AMXX] You Already Have A Greande. And plugin doesn't like giving out extra's");
menu_destroy(menu);
cmd_menu(id);
return PLUGIN_HANDLED;
}
sh_give_weapon(id, CSW_HEGRENADE);
grenadetrail[id] = true;
extrafragdmg[id] = true;
} else {
sh_give_weapon(id, CSW_M3, true);
extradmg[id] = true;
}
}
}
} else client_print(id, print_chat, "[AMXX] You Don't Have Enough Money(You Cheap Bastard)."); //this insult brought to you by 1 random guy :P
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
public client_putinserver(id)
{
set_hudmessage(0, 0, 0, -0.0, 0.0, 0, 0.0, 0.0, 0.0, 0.0, 0);
show_hudmessage(id, "Type /Buy <Weapon Menu>");
}
public super_grenade(id)
{
if ( !sh_is_active() || !is_user_alive(id) ) return;
if ( read_data(1) == AMMOX_HEGRENADE )
{
if ( grenadetrail[id] )
{
new iCurrent = -1
while ( ( iCurrent = engfunc(EngFunc_FindEntityByString, iCurrent, "classname", "grenade") ) > 0 )
{
new string[32]
pev(iCurrent, pev_classname, string, 31)
if ( id == pev(iCurrent, pev_owner) && equali(HEGrenade, string)) //sorry, i'm in the habit of using fakemeta over engine. Engine gave me alot of trouble when I started out and I have a grudge cause of that
{
// Make the nade glow
sh_set_rendering(iCurrent, 225, 0, 20, 100, kRenderFxGlowShell, kRenderTransAlpha); //vittu didn't waste time adding natives for no reason
// Make a trail
message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
write_byte(22); //TE_BEAMFOLLOW
write_short(iCurrent); // entity:attachment to follow
write_short(gTrail); // sprite index
write_byte(10); // life in 0.1's
write_byte(10); // line width in 0.1's
write_byte(225); // colour
write_byte(90);
write_byte(102);
write_byte(255); // brightness
message_end();
grenadetrail[id] = false; //trail is already attached to our current nade so it's safe to remove our status here before user gets another
break; //found our nade so no reason to continue looping through others
}
}
}
}
}
public sh_client_spawn(id)
grenadetrail[id] = false;
__________________
If at first you don't succeed, then skydiving isn't for you.
|
|