Modificare Plugin Native

Modificari necesare ale pluginurilor

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

User avatar
DaNNe.
Fost moderator
Fost moderator
Posts: 2811
Joined: 08 Nov 2013, 20:43
Detinator Steam: Da
CS Status: Activitate scăzută
SteamID: /id/FurienMaster
Reputatie: Nick anterior: DnD. Gold, Emrys
0.5/3
Fost moderator ajutator
Fost Membru Club eXtreamCS (doua luni)
Has thanked: 244 times
Been thanked: 129 times
Contact:

19 Jul 2014, 20:40

Greseala mea...
| Afiseaza codul
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "Aragon*" // El e autor.
//#define CROSSBOW - N-are rost.
#define CROSSBOW_WEAPONKEY	103
#define weapon_crossbow		"weapon_sg552"
#define CSW_CROSSBOW		CSW_SG552
#define CROSSBOW_CLASS		"crossbow_bolt"
#define crossbow_shotdelay	1.0 // Refire rate

new PRIMARY_WEAPONS_BITSUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90);

new BloodSpray, BloodDrop;
new CrossBowModel_V[] = "models/UltimateWeapons/Primary/v_crossbow.mdl";
new CrossBowModel_P[] = "models/UltimateWeapons/Primary/p_crossbow.mdl";
new CrossBowModel_W[] = "models/UltimateWeapons/Primary/w_crossbow.mdl";
new CrossBowModel_S[] = "models/UltimateWeapons/Primary/s_crossbowbolt.mdl";
new CrossBow_Sound[][] = {
	"weapons/crossbow_shoot1.wav",
	"weapons/crossbow_hit1.wav",
	"weapons/crossbow_hit2.wav",
	"weapons/crossbow_hitbod1.wav",
	"weapons/crossbow_hitbod2.wav",
	"weapons/crossbow_foley1.wav",
	"weapons/crossbow_foley2.wav",
	"weapons/crossbow_foley3.wav",
	"weapons/crossbow_foley4.wav",
	"weapons/crossbow_draw.wav"	
};
new CrossBow_Generic[][] = {
	"sprites/uw_crossbow.txt",
	"sprites/UltimateWeapons/CrossBow.spr",
	"sprites/UltimateWeapons/640hud7x.spr"
};
//new bool:HavePrimaryWeapon[33], PrimaryWeapon[33];
new bool:HaveCrossBow[33], Float:CrossBowLastShotTime[33], crossbow_clip[33], crossbow_reload[33], crossbow_trail, crossbow_explode;
new crossbowdamage, crossbowclip, crossbowreloadtime, crossbowradius, crossbowknockback;

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("uw_crossbow", "Hook_CrossBow");
	
	register_event("CurWeapon", "CrossBow_ViewModel", "be", "1=1");
	register_event("WeapPickup","CrossBow_ViewModel","b","1=19");
	
	register_forward(FM_SetModel, "CrossBow_WorldModel");
	register_forward(FM_UpdateClientData, "CrossBow_UpdateClientData_Post", 1);
	register_forward(FM_CmdStart, "CrossBow_CmdStart");	
	
	RegisterHam(Ham_Item_Deploy , weapon_crossbow, "CrossBow_Deploy_Post", 1);
	RegisterHam(Ham_Item_Holster , weapon_crossbow, "CrossBow_Holster");
	RegisterHam(Ham_Item_AddToPlayer, weapon_crossbow, "CrossBow_AddToPlayer");
	RegisterHam(Ham_Weapon_Reload, weapon_crossbow, "CrossBow_Reload");
	RegisterHam(Ham_Weapon_Reload, weapon_crossbow, "CrossBow_Reload_Post", 1);
	RegisterHam(Ham_Item_PostFrame, weapon_crossbow, "CrossBow_PostFrame");	
	
	register_touch(CROSSBOW_CLASS, "*", "CrossBow_Touch");
	
	crossbowdamage = register_cvar("uw_crossbow_damage", "100");			//| CrossBow Damage |//
	crossbowclip = register_cvar("uw_crossbow_clip", "10");			//| CrossBow Clip |//
	crossbowreloadtime = register_cvar("uw_crossbow_reload_time", "3.33");	//| CrossBow Reload Time |//
	crossbowradius = register_cvar("uw_crossbow_radius", "200");			//| CrossBow Radius |//
	crossbowknockback = register_cvar("uw_crossbow_knockback", "6");		//| CrossBow KnockBack |//
}
	

public plugin_precache() {
	BloodSpray = precache_model("sprites/bloodspray.spr");
	BloodDrop  = precache_model("sprites/blood.spr");
	
	precache_model(CrossBowModel_V)
	precache_model(CrossBowModel_P)
	precache_model(CrossBowModel_W)
	precache_model(CrossBowModel_S)
	
	crossbow_trail = precache_model("sprites/xbeam3.spr");
	crossbow_explode = precache_model("sprites/UltimateWeapons/crossbow_explode.spr");
	
	for(new i = 0; i < sizeof(CrossBow_Sound); i++)
		engfunc(EngFunc_PrecacheSound, CrossBow_Sound);	
	for(new i = 0; i < sizeof(CrossBow_Generic); i++)
		engfunc(EngFunc_PrecacheGeneric, CrossBow_Generic);
}


public CrossBow_ViewModel(id) {
	if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id)) {
		set_pev(id, pev_viewmodel2, CrossBowModel_V);
		set_pev(id, pev_weaponmodel2, CrossBowModel_P);
	}
}

public CrossBow_WorldModel(entity, model[]) {
	if(!is_valid_ent(entity))
		return FMRES_IGNORED;
	
	static ClassName[33];
	entity_get_string(entity, EV_SZ_classname, ClassName, charsmax(ClassName));
	
	if(!equal(ClassName, "weaponbox"))
		return FMRES_IGNORED;
	
	new Owner = entity_get_edict(entity, EV_ENT_owner);	
	new CrossBow = find_ent_by_owner(-1, weapon_crossbow, entity);
	
	if(get_user_crossbow(Owner) && is_valid_ent(CrossBow) && equal(model, "models/w_sg552.mdl")) {
		entity_set_int(CrossBow, EV_INT_impulse, CROSSBOW_WEAPONKEY);
		HaveCrossBow[Owner] = false;
		entity_set_model(entity, CrossBowModel_W);
		set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~(1<<6))
		return FMRES_SUPERCEDE;
	}
	return FMRES_IGNORED;
}

public CrossBow_UpdateClientData_Post(id, sendweapons, cd_handle) {
	if(is_user_alive(id) && is_user_connected(id)) {
		if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id))	
			set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
	}
}

public CrossBow_CmdStart(id, uc_handle, seed) {
	if(is_user_alive(id) && is_user_connected(id)) {
		static CurButton;
		CurButton = get_uc(uc_handle, UC_Buttons);
		new Float:NextAttack = get_pdata_float(id, 83, 5);
		
		static CrossBow;
		CrossBow = fm_find_ent_by_owner(-1, weapon_crossbow, id);	
		
		if(CurButton & IN_ATTACK) {
			if(get_user_weapon(id) == CSW_CROSSBOW && get_user_crossbow(id)) {				
				if(cs_get_weapon_ammo(CrossBow) > 0 && !crossbow_reload[id] && NextAttack <= 0.0) {
					if(get_gametime() - CrossBowLastShotTime[id] > crossbow_shotdelay) {
						set_weapon_anim(id, random_num(1,2));
						emit_sound(id, CHAN_WEAPON,CrossBow_Sound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
						
						CrossBow_Fire(id);
						
						static Float:PunchAngles[3];
						
						PunchAngles[0] = random_float(-4.0, -5.0);
						PunchAngles[1] = 0.0;
						PunchAngles[2] = 0.0;
						
						set_pev(id, pev_punchangle, PunchAngles);
						cs_set_weapon_ammo(CrossBow, cs_get_weapon_ammo(CrossBow) - 1);
						
						CrossBowLastShotTime[id] = get_gametime();
					}
				}
				CurButton &= ~IN_ATTACK;
				set_uc(uc_handle, UC_Buttons, CurButton);
			}
			
		}
	}
}

public CrossBow_AddToPlayer(Weapon, id) {
	if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == CROSSBOW_WEAPONKEY) {
		HaveCrossBow[id] = true;
		entity_set_int(Weapon, EV_INT_impulse, 0);
	}
	//WeaponList(id, CSW_CROSSBOW)
}

public CrossBow_Deploy_Post(entity) {
	static Owner;
	Owner = fm_get_weapon_ent_owner(entity);
	if(get_user_crossbow(Owner)) {
		set_pev(Owner, pev_viewmodel2, CrossBowModel_V);
		set_pev(Owner, pev_weaponmodel2, CrossBowModel_P);
		set_pdata_float(Owner, 83, 1.03, 5);
		set_weapon_anim(Owner, 4);
		static clip;
		clip = cs_get_weapon_ammo(entity);
		if(clip > 0)
			crossbow_reload[Owner] = 0;
		
		set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) | (1<<6))
	}
}

public CrossBow_Holster(entity) {
	static Owner;
	Owner = fm_get_weapon_ent_owner(entity);
	if(get_user_crossbow(Owner)) {
		set_pdata_int(Owner, 361, get_pdata_int(Owner, 361) & ~(1<<6))
	}
}

public CrossBow_Reload(ent) {
	if(!pev_valid(ent))
		return HAM_IGNORED;
	
	new id;
	id = pev(ent, pev_owner);
	
	if(!is_user_alive(id) || !get_user_crossbow(id))
		return HAM_IGNORED;
	
	crossbow_clip[id] = -1;
	
	new Ammo = cs_get_user_bpammo(id, CSW_CROSSBOW);
	if(Ammo <= 0)
		return HAM_SUPERCEDE;
	
	new Clip = get_pdata_int(ent, 51, 4);
	if(Clip >= get_pcvar_num(crossbowclip))
		return HAM_SUPERCEDE;
	
	crossbow_clip[id] = Clip;
	crossbow_reload[id] = 1;
	
	return HAM_IGNORED;
}

public CrossBow_Reload_Post(ent) {
	if(!pev_valid(ent))
		return HAM_IGNORED;
	
	new id;
	id = pev(ent, pev_owner);
	
	if(!is_user_alive(id) || !get_user_crossbow(id))
		return HAM_IGNORED;
	
	if(crossbow_clip[id] == -1)
		return HAM_IGNORED;
	
	new Float:reload_time = get_pcvar_float(crossbowreloadtime);
	
	set_pdata_int(ent, 51, crossbow_clip[id], 4);
	set_pdata_float(ent, 48, reload_time, 4);
	set_pdata_float(id, 83, reload_time, 5);
	set_pdata_int(ent, 54, 1, 4);
	set_weapon_anim(id, 3);
	return HAM_IGNORED;
}

public CrossBow_PostFrame(ent) {
	if(!pev_valid(ent))
		return HAM_IGNORED;
	
	new id;
	id = pev(ent, pev_owner);
	
	if(!is_user_alive(id) || !get_user_crossbow(id))
		return HAM_IGNORED;
	
	new Float:NextAttack = get_pdata_float(id, 83, 5);
	new Ammo = cs_get_user_bpammo(id, CSW_CROSSBOW);
	
	new Clip = get_pdata_int(ent, 51, 4);
	new InReload = get_pdata_int(ent, 54, 4);
	
	if(InReload && NextAttack <= 0.0) {
		new Temp = min(get_pcvar_num(crossbowclip) - Clip, Ammo);
		
		set_pdata_int(ent, 51, Clip + Temp, 4);
		cs_set_user_bpammo(id, CSW_CROSSBOW, Ammo - Temp);		
		set_pdata_int(ent, 54, 0, 4);
		
		InReload = 0;
		crossbow_reload[id] = 0;
	}		
	
	return HAM_IGNORED;
}

public CrossBow_Fire(id) {	
	new ent, Float:Origin[3], Float:Angles[3], Float:Velocity[3];
	
	ent = create_entity("info_target");
	engfunc(EngFunc_GetAttachment, id, 0, Origin, Angles);
	pev(id, pev_angles, Angles);
	
	set_pev(ent, pev_origin, Origin);
	set_pev(ent, pev_angles, Angles);
	set_pev(ent, pev_solid, 2);
	set_pev(ent, pev_movetype, 5);
	
	set_pev(ent, pev_classname, CROSSBOW_CLASS);
	
	set_pev(ent, pev_owner, id);
	engfunc(EngFunc_SetModel, ent, CrossBowModel_S);
	
	set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
	set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});
	
	velocity_by_aim(id, 2000, Velocity);
	set_pev(ent, pev_velocity, Velocity);
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
	write_byte(TE_BEAMFOLLOW); // TE id
	write_short(ent); // entity:attachment to follow
	write_short(crossbow_trail); // sprite index
	write_byte(25); // life in 0.1's
	write_byte(1); // line width in 0.1's
	write_byte(255); // r
	write_byte(0); // g
	write_byte(0); // b
	write_byte(200); // brightness
	message_end();
	
	set_pev(ent, pev_iuser4, 0);
	
	return PLUGIN_CONTINUE;
}

public CrossBow_Touch(bolt, touch) {
	if(is_valid_ent(bolt)) {
		new id = pev(bolt, pev_owner);
		
		new Float:BoltOrigin[3];
		pev(bolt, pev_origin, BoltOrigin);
		
		engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, BoltOrigin, 0);
		write_byte(TE_EXPLOSION);
		engfunc(EngFunc_WriteCoord, BoltOrigin[0]); // Position X
		engfunc(EngFunc_WriteCoord, BoltOrigin[1]); // Position Y
		engfunc(EngFunc_WriteCoord, BoltOrigin[2]); // Position Z
		write_short(crossbow_explode); // Sprite index
		write_byte(15); // Scale
		write_byte(15); // Frame rate
		write_byte(0); // Flags
		message_end();
		
		for(new Victim = 1; Victim < get_maxplayers(); Victim++) {
			if(is_user_connected(Victim) && is_user_alive(Victim) && !fm_get_user_godmode(Victim) && get_user_team(Victim) != get_user_team(id) && Victim != id) {
				new Float:VictimOrigin[3], Float:Distance_F, Distance;
				pev(Victim, pev_origin, VictimOrigin);
				Distance_F = get_distance_f(BoltOrigin, VictimOrigin);
				Distance = floatround(Distance_F);
				
				if(Distance <= get_pcvar_float(crossbowradius)) {
					new Float:DistanceRatio, Float:Damage;
					DistanceRatio = floatdiv(float(Distance), get_pcvar_float(crossbowradius));
					Damage = get_pcvar_float(crossbowdamage) - floatround(floatmul(get_pcvar_float(crossbowdamage), DistanceRatio));
					
					new BloodColor = ExecuteHam(Ham_BloodColor, Victim);
					if(BloodColor != -1) {
						new Amount = floatround(Damage);
						
						Amount *= 2; //according to HLSDK
						
						message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
						write_byte(TE_BLOODSPRITE);
						write_coord(floatround(VictimOrigin[0]));
						write_coord(floatround(VictimOrigin[1]));
						write_coord(floatround(VictimOrigin[2]));
						write_short(BloodSpray);
						write_short(BloodDrop);
						write_byte(BloodColor);
						write_byte(min(max(3, Amount/10), 16));
						message_end();
					}
					
					make_knockback(Victim, BoltOrigin, get_pcvar_float(crossbowknockback)*Damage);	
					
					if(get_user_health(Victim) - Damage >= 1) {
						ExecuteHam(Ham_TakeDamage, Victim, id, id, Damage, DMG_BLAST);
						
						message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, Victim);
						write_byte(0);
						write_byte(0);
						write_long(DMG_BLAST);
						write_coord(0) ;
						write_coord(0);
						write_coord(0);
						message_end();
						
						message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), {0,0,0}, Victim);
						write_short(1<<13);
						write_short(1<<14);
						write_short(0x0000);
						write_byte(255);
						write_byte(255);
						write_byte(255);
						write_byte(100) ;
						message_end();
						
						message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, Victim);
						write_short(0xFFFF);
						write_short(1<<13);
						write_short(0xFFFF) ;
						message_end();
					}
					else {				
						death_message(id, Victim, "CrossBow");
					}
				}
			}
		}
		static ClassName[32];
		pev(touch, pev_classname, ClassName, charsmax(ClassName));
		if(equal(ClassName, "func_breakable")) {		
			if(entity_get_float(touch, EV_FL_health) <= get_pcvar_num(crossbowdamage)) {
				force_use(id, touch);
			}
		}
		
		engfunc(EngFunc_RemoveEntity, bolt);
	}
}

public Hook_CrossBow(id) {
	engclient_cmd(id, weapon_crossbow);
}

public get_user_crossbow(id) {
	return HaveCrossBow[id];
}
public plugin_natives() {
	register_native("set_user_crossbow","give_crossbow",1)
	register_native("delete_crossbow","delete_crossbow",1);
}
public delete_crossbow(id)
	set_user_crossbow(id, false)

public give_crossbow(id)
	set_user_crossbow(id, true)

public set_user_crossbow(id, crossbow) {
	if(crossbow) {
		if(!HaveCrossBow[id]) {
			drop_primary_weapons(id);
			HaveCrossBow[id] = true;
			crossbow_reload[id] = 0;
			fm_give_item(id, weapon_crossbow);
			new Clip = fm_get_user_weapon_entity(id, CSW_CROSSBOW);
			cs_set_weapon_ammo(Clip, get_pcvar_num(crossbowclip));
			//WeaponList(id, CSW_CROSSBOW)
		}
	}
	else {
		if(HaveCrossBow[id]) {
			HaveCrossBow[id] = false;
		}
	}
}

public make_knockback(Victim, Float:origin[3], Float:maxspeed) {
	new Float:fVelocity[3];
	kickback(Victim, origin, maxspeed, fVelocity);
	entity_set_vector(Victim, EV_VEC_velocity, fVelocity);
	
	return(1);
}


stock fm_get_weapon_ent_owner(ent) {
	return get_pdata_cbase(ent, 41, 4);
}

stock drop_primary_weapons(Player) {
	static weapons[32], num, i, weaponid;
	num = 0;
	get_user_weapons(Player, weapons, num);
	
	for(i = 0; i < num; i++) {
		weaponid = weapons ;
		
		if(((1<<weaponid) & PRIMARY_WEAPONS_BITSUM)) {
			static wname[32];
			get_weaponname(weaponid, wname, charsmax(wname));
			
			engclient_cmd(Player, "drop", wname);
		}
	}
}

stock set_weapon_anim(id, anim) {
	set_pev(id, pev_weaponanim, anim);
	if(is_user_connected(id)) {
		message_begin(MSG_ONE, SVC_WEAPONANIM, _, id);
		write_byte(anim);
		write_byte(pev(id, pev_body));
		message_end();
	}
}
stock death_message(Killer, Victim, const Weapon[]) {
	set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET);
	ExecuteHamB(Ham_Killed, Victim, Killer, 2);
	set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT);
	
	make_deathmsg(Killer, Victim, 0, Weapon);
	cs_set_user_money(Killer, cs_get_user_money(Killer) + 300);
	
	message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"));
	write_byte(Killer); // id
	write_short(pev(Killer, pev_frags)); // frags
	write_short(cs_get_user_deaths(Killer)); // deaths
	write_short(0); // class?
	write_short(get_user_team(Killer)); // team
	message_end();
	
	message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"));
	write_byte(Victim); // id
	write_short(pev(Victim, pev_frags)); // frags
	write_short(cs_get_user_deaths(Victim)); // deaths
	write_short(0); // class?
	write_short(get_user_team(Victim)); // team
	message_end();
}

stock kickback(ent, Float:fOrigin[3], Float:fSpeed, Float:fVelocity[3]) {
	new Float:fEntOrigin[3];
	entity_get_vector(ent, EV_VEC_origin, fEntOrigin);
	
	new Float:fDistance[3];
	fDistance[0] = fEntOrigin[0] - fOrigin[0];
	fDistance[1] = fEntOrigin[1] - fOrigin[1];
	fDistance[2] = fEntOrigin[2] - fOrigin[2];
	new Float:fTime = (vector_distance(fEntOrigin,fOrigin) / fSpeed);
	fVelocity[0] = fDistance[0] / fTime;
	fVelocity[1] = fDistance[1] / fTime;
	fVelocity[2] = fDistance[2] / fTime;
	
	return(fVelocity[0] && fVelocity[1] && fVelocity[2]);
}

Merge acum. :)
RoyalServer
User avatar
WOASRY
Membru, skill 0
Membru, skill 0
Posts: 27
Joined: 24 Sep 2012, 11:18
Detinator Steam: Nu
Detinator server CS: GOLD.REDFEAR.RO
Has thanked: 9 times

20 Jul 2014, 13:00

Merge , multumesc frumos pentru ajutor :D
Image
Post Reply

Return to “Modificari pluginuri”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 17 guests