|
Senior Member
Join Date: Oct 2009
Location: Budapest, Hungary
|

11-19-2010
, 15:25
Re: Simple new Weapon
|
#8
|
I am currently making a medkit with my pal, here is where we are now. We are currently in the state of blocking all what is left of a knife. These are the things you need to look out, if you want to block a knife:
Code:
- weapon sounds ( see the zp_extra_chainsaw plugin for sound changing )
- view model - you see this inside
- world model - attached to the player, seen from outside
- weapon events, damaging
But there are 3 problems, that I see now:
Code:
- The weapon animations( in viewmodel ) may differ from the one you would like to change( eg. knife )
- The same goes for the world model( medkit in the left hand, right hand still animates knife moves - without any actual knife
- The id of the changed weapon is not the same in other plugins, unless you hardcode it inside your plugin( Knife in CS != Crowbar in HL != Briefcase SI ) for every mod.
Our code so far is heavily under construction, but you can snatch out some ideas on weapon creating:
PHP Code:
#include <amxmodx> #include <fakemeta>
//=========================================== // Macros //===========================================
#define xor(%1,%2) ((%1 & ~%2) | (~%1 & %2)) #define id_to_flag(%1) (1<<(%1-1))
#define toggle(%1,%2) (%1 = xor(%1, id_to_flag(%2))) #define clear(%1,%2) (%1 = %1 & ~id_to_flag(%2)) #define set(%1,%2) (%1 = %1 | id_to_flag(%2)) #define is_set(%1,%2) (%1 & id_to_flag(%2))
//=========================================== // Constants, defines //===========================================
#define OFFSET_TEAM 114 #define OFFSET_DEATHS 444
#define DISTANCE 100
#define SND_ERROR 0 #define SND_HEAL 1 #define SND_REVIVE 2
new const medkit_models[][] = { "models/medkit/v_medkit.mdl", "models/medkit/p_medkit.mdl" }
new const medkit_sounds[][] = { "items/medshotno1.wav", "items/medshot4.wav", "items/suitchargeok1.wav" }
//=========================================== // Variables //===========================================
new cvar_enabled, cvar_revivecost, cvar_maxmedkitammo;
new msg_scoreinfo, msg_curweapon;
new dead_origin[32][3]; new medkit_ammo[32]; new max_health[32];
new knife_selected; new medkit_selected; new has_medkit; new attack1, attack2;
//=========================================== // Plugin starts //===========================================
public plugin_init() { register_plugin("SC Medkit", "0.1", "EXaNoVA & Lulu the hero"); attack1 = 0; attack2 = 0; knife_selected = 0; medkit_selected = 0; has_medkit = 0; msg_scoreinfo = get_user_msgid("ScoreInfo"); msg_curweapon = get_user_msgid("CurWeapon"); cvar_enabled = register_cvar("medkit_enabled", "1"); cvar_reviveammo = register_cvar("medkit_revivecost", "50"); cvar_maxmedkitammo = register_cvar("medkit_maxmedkitammo", "100"); register_event("CurWeapon", "event_weapon_change", "be", "1=1"); register_event("DeathMsg", "event_death", "a"); register_event("ResetHUD", "event_resethud", "be"); register_event("TeamInfo", "event_teaminfo", "a"); register_clcmd("say medkit", "test"); register_forward(FM_EmitSound, "fw_emit_sound"); register_forward(FM_PlayerPreThink, "fw_player_think"); }
public plugin_precache() { new i; for(i=0; i<sizeof medkit_sounds; i++) { precache_sound(medkit_sounds[i]); } for(i=0; i<sizeof medkit_models; i++) { precache_model(medkit_models[i]); } }
public client_connect(id) { max_health[id-1] = 0; clear(has_medkit, id); }
//=========================================== // Events //===========================================
public event_death(id) { static victim; victim = read_data(2); get_user_origin(victim, dead_origin[victim-1]) }
public event_resethud(id) { if(!is_user_alive(id)) { return; } player_spawn(id); }
// Code by ConnorMcLeod public event_teaminfo() { static id, team; id = read_data(1); if(!is_user_alive(id) && is_user_connected(id)) { team = get_pdata_int(id, OFFSET_TEAM, 5); if(team != get_user_team(id)) { emessage_begin(MSG_BROADCAST, msg_scoreinfo); ewrite_byte(id); ewrite_short(get_user_frags(id)); ewrite_short(get_pdata_int(id, OFFSET_DEATHS, 5)); ewrite_short(0); ewrite_short(team); emessage_end(); } } }
public event_weapon_change(id) { if(read_data(2) == CSW_KNIFE) { set(knife_selected, id); if(is_set(has_medkit, id)) { is_set(medkit_selected, id) { set_medkit(id); } } } else { clear(knife_selected, id); } }
//=========================================== // Forwards //===========================================
public fw_emit_sound(id, channel, const sound[]) { if(!is_set(has_medkit, id) || !is_set(knife_selected, id) || !is_set(medkit_selected, id) || !is_user_alive(id) || !((channel==CHAN_WEAPON) || (channel==CHAN_ITEM)) || get_cvar_num(cvar_enabled)) { return FMRES_IGNORED; } return FMRES_SUPERCEDE; }
public fw_player_think(id) { static buttons, a1, a2; buttons = pev(id, pev_button); a1 = is_set(attack1, id); a2 = is_set(attack2, id); if(buttons & IN_ATTACK) { if(!a1) { attack1_pressed(id); } set(attack1, id); } else { if(a1) { attack1_released(id); } clear(attack1, id); } if(buttons & IN_ATTACK2) { if(!a2) { attack2_pressed(id); } set(attack2, id); } else { if(a2) { attack2_released(id); } clear(attack2, id); } }
//=========================================== // Created events //===========================================
public player_spawn(id) { max_health[id-1] = pev(id, pev_health); medkit_ammo[id-1] = get_cvar_num(cvar_maxmedkitammo)%2; }
public player_respawn(id) { set_pev(id, pev_health, float(max_health[id-1])/2); }
public attack1_pressed(id) { if(!is_set(has_medkit, id) || !is_set(knife_selected, id) || !is_set(medkit_selected, id) || !is_user_alive(id) || get_cvar_num(cvar_enabled)) { return; } emit_sound(id, CHAN_WEAPON, medkit_sounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM); }
public attack1_released(id) { }
public attack2_pressed(id) { if(!is_set(has_medkit, id) || !is_set(knife_selected, id) || !is_set(medkit_selected, id) || !is_user_alive(id) || get_cvar_num(cvar_enabled) || (medkit_ammo[id]>get_cvar_num(cvar_revivecost))) { return; } emit_sound(id, CHAN_WEAPON, medkit_sounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM); }
public attack2_released(id) { }
//=========================================== // ?? //===========================================
public test(id) { toggle(has_medkit, id); }
public set_knife(id) { engclient_cmd(id, "weapon_knife"); emessage_begin(MSG_ONE, msg_curweapon, _, id); ewrite_byte(1); ewrite_byte(CSW_KNIFE); ewrite_byte(-1); emessage_end(); }
public set_medkit(id) { set_pev(id, pev_viewmodel2, medkit_models[0]); set_pev(id, pev_weaponmodel2, medkit_models[1]); }
Hope this helps, but I also hope, that someone can give me some hints on the problems listed above.
|
|