ZP Class: Arahnid

Pluginuri pentru modul AmxModX.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Post Reply
User avatar
Rainq
Membru, skill +2
Membru, skill +2
Posts: 681
Joined: 21 Jul 2015, 19:50
Detinator Steam: Da
CS Status: Retras
Detinator server CS: zm.extreamcs.com
SteamID: mrainq
Reputatie: Fost super moderator
Fost detinator ZM.eXtreamCS.COM
Fost Membru Club eXtreamCS (trei luni)
Fond eXtream: 0
Location: Bucharest
Discord: manuraiders
Has thanked: 29 times
Been thanked: 51 times
Contact:

09 Apr 2019, 01:31

Image
Descriere: Acest zombie are puterea de la smoker cu drag si poate sa se catare pe pereti :)


Descarcare: LINK RESURSE!

Code: Select all

#include <amxmodx>
#include <zombieplague>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <cstrike>
#include <zombieplague>

#define ADMIN ADMIN_LEVEL_H
#define PLUGIN "[ZP] Class Arahnid"
#define VERSION "0.1"
#define AUTHOR "MyeRo"

#define STR_T           32

// Stuff taken from fakemeta_util
#define fm_get_user_button(%1) pev(%1, pev_button)	
/* stock fm_get_user_button(index)
	return pev(index, pev_button) */

#define fm_get_entity_flags(%1) pev(%1, pev_flags)
/* stock fm_get_entity_flags(index)
	return pev(index, pev_flags) */

stock fm_set_user_velocity(entity, const Float:vector[3]) {
	set_pev(entity, pev_velocity, vector);

	return 1;
}

//End of stuff from fakemeta_util
//new STR_T[32]
new bool:g_WallClimb[33]
new Float:g_wallorigin[32][3]
new cvar_zp_wallclimb, cvar_zp_wallclimb_nemesis, cvar_zp_wallclimb_survivor

new bool:caughtJump[33]
new bool:doJump[33]
new Float:jumpVeloc[33][3]
new newButton[33]
new numJumps[33]

//Main Class, modelT & Sprite Beam
new g_zclass_smoker, g_Line
new const generic_models[][] = { "models/player/zombie_source/zombie_source.mdl" } 
//Sounds
new g_sndMiss[] = "zombie_plague/Smoker_TongueHit_miss.wav"
new g_sndDrag[] = "zombie_plague/Smoker_TongueHit_drag.wav"
//Some vars
new g_hooked[33], g_hooksLeft[33]
new Float:g_lastHook[33]
//Cvars
new cvar_maxdrags, cvar_dragspeed, cvar_cooldown, cvar_dmg2stop, cvar_mates, cvar_bind
//Smoker Atributes
new const zclass_name[] = { "Arahnid" }
new const zclass_info[] = { "wallclimb + walljump + drag" }
new const zclass_model[] = { "zombie_source" }
new const zclass_clawmodel[] = { "v_executioner_axe.mdl" }
const zclass_health = 2000
const zclass_speed = 240
const Float:zclass_gravity = 1.0
const Float:zclass_knockback = 1.0

public plugin_init()
{
	cvar_dragspeed = register_cvar("zp_smoker_dragspeed", "180")
	cvar_maxdrags = register_cvar("zp_smoker_maxdrags", "100")
	cvar_cooldown = register_cvar("zp_smoker_cooldown", "5")
	cvar_dmg2stop = register_cvar("zp_smoker_dmg2stop", "75")
	cvar_mates = register_cvar("zp_smoker_mates", "1")
	cvar_bind = register_cvar("zp_smoker_bind", "1")
	cvar_zp_wallclimb = register_cvar("zp_wallclimb", "1")
	cvar_zp_wallclimb_survivor = register_cvar("zp_wallclimb_survivor", "0")
	cvar_zp_wallclimb_nemesis = register_cvar("zp_wallclimb_nemesis", "1")
	register_cvar("walljump_str","600.0")
        register_cvar("walljump_num","50")
	register_touch("player", "worldspawn", "Touch_World")
	register_touch("player", "func_wall", "Touch_World")
	register_touch("player", "func_breakable", "Touch_World")	
        register_event("ResetHUD", "newSpawn", "b")
	register_event("DeathMsg", "smoker_death", "a")
        register_event("DeathMsg","EventDeathMsg","a")
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	register_clcmd("+drag","drag_start", ADMIN_USER, "bind ^"key^" ^"+drag^"")
	register_clcmd("-drag","drag_end")
	register_forward(FM_Touch, 		"fwd_touch")
	register_forward(FM_PlayerPreThink, 	"fwd_playerprethink")

}
public plugin_precache()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	g_zclass_smoker = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
	precache_sound(g_sndDrag)
	precache_sound(g_sndMiss)
	g_Line = precache_model("sprites/zbeam4.spr")
	
	for (new i = 0; i < sizeof generic_models; i++)
	precache_model(generic_models[i])
}

public fwd_touch(id, world)
{
	if(!is_user_alive(id) || !g_WallClimb[id])
		return FMRES_IGNORED
	new player = STR_T
	if (!player)
		return FMRES_IGNORED
		
	new classname[STR_T]
	pev(world, pev_classname, classname, (STR_T))
	
	if(equal(classname, "worldspawn") || equal(classname, "func_wall") || equal(classname, "func_breakable"))
		pev(id, pev_origin, g_wallorigin[id])

	return FMRES_IGNORED
}

public fwd_playerprethink(id) 
{
	if(!g_WallClimb[id] || !zp_get_user_zombie(id)) 
		return FMRES_IGNORED
		
	if(zp_is_survivor_round() && get_pcvar_num(cvar_zp_wallclimb_survivor) == 0)
		return FMRES_IGNORED
		
	if(zp_is_nemesis_round() && get_pcvar_num(cvar_zp_wallclimb_nemesis) == 0)
		return FMRES_IGNORED
	
	new button = fm_get_user_button(id)
	
	if((get_pcvar_num(cvar_zp_wallclimb) == 1) && (button & IN_USE) && (zp_get_user_zombie_class(id) == g_zclass_smoker)) //Use button = climb
	wallclimb(id, button)
	else if((get_pcvar_num(cvar_zp_wallclimb) == 2) && (button & IN_JUMP) && button & IN_DUCK && (zp_get_user_zombie_class(id) == g_zclass_smoker)) //Jump + Duck = climb
	wallclimb(id, button)

	return FMRES_IGNORED
}

public wallclimb(id, button)
{
	static Float:origin[3]
	pev(id, pev_origin, origin)

	if(get_distance_f(origin, g_wallorigin[id]) > 25.0)
		return FMRES_IGNORED  // if not near wall
	
	if(fm_get_entity_flags(id) & FL_ONGROUND)
		return FMRES_IGNORED
		
	if(button & IN_FORWARD)
	{
		static Float:velocity[3]
		velocity_by_aim(id, 120, velocity)
		fm_set_user_velocity(id, velocity)
	}
	else if(button & IN_BACK)
	{
		static Float:velocity[3]
		velocity_by_aim(id, -120, velocity)
		fm_set_user_velocity(id, velocity)
	}
	return FMRES_IGNORED
}	

public EventDeathMsg()	
{
	new id = read_data(2)
	g_WallClimb[id] = true
	return PLUGIN_HANDLED
}

public client_connect(id) 
{
	g_WallClimb[id] = true	
}

public Touch_World(id, world) 
{
	if(is_user_alive(id)) 
	{
		//if we touch wall and have jump pressed, setup for jump
		if(caughtJump[id] && (newButton[id] & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND)) 
		{
			
			//reverse velocity
			for(new x=0;x<2;x++)
				jumpVeloc[id][x] *= -1.0
				
			numJumps[id]++
			doJump[id] = true
		}	
	}
}

public client_PostThink(id) 
{
	
	if(!is_user_alive(id) || !zp_get_user_zombie(id)) return PLUGIN_CONTINUE
	if(zp_get_user_zombie_class(id) != g_zclass_smoker) return PLUGIN_CONTINUE
	
	//do velocity if we walljumped
	if(doJump[id]) 
	{
		entity_set_vector(id,EV_VEC_velocity,jumpVeloc[id])
		doJump[id] = false
		return PLUGIN_CONTINUE
	}
	if(numJumps[id] >= get_cvar_num("walljump_num")) //reset if we ran out of jumps
	{
		numJumps[id] = 0
		caughtJump[id] = false
		return PLUGIN_CONTINUE
	}	
	return PLUGIN_CONTINUE
}

public client_PreThink(id)
{
	if(!is_user_alive(id) || !zp_get_user_zombie(id)) return PLUGIN_CONTINUE
	if(zp_get_user_zombie_class(id) != g_zclass_smoker) return PLUGIN_CONTINUE 
	
	newButton[id] = get_user_button(id)
	new oldButton = get_user_oldbutton(id)
	new flags = get_entity_flags(id)

	if(caughtJump[id] && (flags & FL_ONGROUND)) 
	{
		numJumps[id] = 0
		caughtJump[id] = false
		return PLUGIN_CONTINUE
	}	
		
	//begin when we jump
	if((newButton[id] & IN_JUMP) && (flags & FL_ONGROUND) && !caughtJump[id] && !(oldButton & IN_JUMP) && !numJumps[id]) 
	{
		caughtJump[id] = true
		entity_get_vector(id,EV_VEC_velocity,jumpVeloc[id])
		jumpVeloc[id][2] = get_cvar_float("walljump_str")
		return PLUGIN_CONTINUE
	}	
	return PLUGIN_CONTINUE
}

public zp_user_infected_post(id, infector)
{
	if (zp_get_user_zombie_class(id) == g_zclass_smoker) {
		g_hooksLeft[id] = get_pcvar_num(cvar_maxdrags)
		new mode = get_pcvar_num(cvar_bind)
		
		if (mode == 1) {
			client_cmd(id, "bind v ^"+drag^"")
			client_print(id, print_chat, "[ZP] To drag player to youself hold ^'^'V^'^'")
		}
		if (mode == 0) {
			client_print(id, print_chat, "[ZP] To drag player to youself (bind ^'^'key^'^' ^'^'+drag^'^') hold binded key")
		}
	}
}

public newSpawn(id)
{
	g_lastHook[id] = get_gametime()
	
	beam_remove(id)
	if (g_hooked[id])
		drag_end(id)
}

public drag_start(id) // starts drag, checks if player is Smoker, checks cvars
{
	if (zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_smoker) {
		
		static Float:cdown
		cdown = get_pcvar_float(cvar_cooldown)
		
		if (!is_user_alive(id)) {
			client_print(id, print_chat, "[ZP] You can't drag if you are dead!")
			return
		}

		if (g_hooksLeft[id] <= 0) {
			client_print(id, print_chat, "[ZP] You can't drag anymore!")
			return
		}
			
		if (get_gametime() - g_lastHook[id] < cdown) {
			client_print(id, print_chat, "[ZP] Wait %.fsec. to drag again!", get_pcvar_float(cvar_cooldown) - (get_gametime() - g_lastHook[id]))
			return
		}

		if (g_hooksLeft[id] > 0) {
			g_hooksLeft[id]--
			client_print(id, print_chat, "[ZP] You can drag player to youself %d time%s", g_hooksLeft[id], (g_hooksLeft[id] < 2) ? "" : "s")
		}

		new hooktarget, body

		get_user_aiming(id, hooktarget, body)
		
		if (is_user_alive(hooktarget)) {
			if (get_user_team(hooktarget) != get_user_team(id)) {
				g_hooked[id] = hooktarget
				emit_sound(hooktarget, CHAN_BODY, g_sndDrag, 1.0, ATTN_NORM, 0, PITCH_HIGH)
			} else {
				if (get_user_team(hooktarget) == get_user_team(id)) {
					if (get_pcvar_num(cvar_mates) == 0) {
						client_print(id, print_chat, "[ZP] You can't drag teammates!")
						return
					}
					if (get_pcvar_num(cvar_mates) == 1) {
						g_hooked[id] = hooktarget
						emit_sound(hooktarget, CHAN_BODY, g_sndDrag, 1.0, ATTN_NORM, 0, PITCH_HIGH)
					}
				} else {
					g_hooked[id] = 33
					noTarget(id)
					emit_sound(hooktarget, CHAN_BODY, g_sndMiss, 1.0, ATTN_NORM, 0, PITCH_HIGH)
					return
				}
			}

			new parm[2]
			parm[0] = id
			parm[1] = hooktarget
			
			set_task(0.1, "smoker_reelin", id, parm, 2, "b")
			harpoon_target(parm)
		} else {
			g_hooked[id] = 33
			noTarget(id)
			emit_sound(hooktarget, CHAN_BODY, g_sndMiss, 1.0, ATTN_NORM, 0, PITCH_HIGH)
		}
	} else {
		return
	}
}

public smoker_reelin(parm[]) // dragging player to smoker
{
	new id = parm[0]
	new victim = parm[1]

	if (!g_hooked[id])
		return

	if (!is_user_alive(victim)) {
		drag_end(id)
		return
	}

	new Float:fl_Velocity[3]
	new idOrigin[3], vicOrigin[3]

	get_user_origin(victim, vicOrigin)
	get_user_origin(id, idOrigin)

	new distance = get_distance(idOrigin, vicOrigin)

	if (distance > 1) {
		new Float:fl_Time = distance / get_pcvar_float(cvar_dragspeed)

		fl_Velocity[0] = (idOrigin[0] - vicOrigin[0]) / fl_Time
		fl_Velocity[1] = (idOrigin[1] - vicOrigin[1]) / fl_Time
		fl_Velocity[2] = (idOrigin[2] - vicOrigin[2]) / fl_Time
	} else {
		fl_Velocity[0] = 0.0
		fl_Velocity[1] = 0.0
		fl_Velocity[2] = 0.0
	}

	entity_set_vector(victim, EV_VEC_velocity, fl_Velocity) //<- rewritten. now uses engine
}

public drag_end(id) // drags end function
{
	g_hooked[id] = 0
	beam_remove(id)
	remove_task(id)
	
	if (get_gametime() - g_lastHook[id] <= get_pcvar_float(cvar_cooldown) + 0.08) {
		return
	} else {
		g_lastHook[id] = get_gametime()
	}
}

public smoker_death() // if smoker dies drag off
{
	new id = read_data(2)
	
	beam_remove(id)
	
	if (g_hooked[id])
		drag_end(id)
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) // if take damage drag off
{
	if (victim == attacker || !is_user_connected(attacker)) {
		if (damage > 25) {
			drag_end(victim)
			return HAM_IGNORED;
		}
	}
	
	if (get_user_team(attacker) != get_user_team(victim)) {
		if (damage > get_pcvar_num(cvar_dmg2stop)) {
			drag_end(victim)
			return HAM_IGNORED;
		}
	}
		
	return HAM_IGNORED;
}

public client_disconnect(id) // if client disconnects drag off
{
	caughtJump[id] = false
	doJump[id] = false
	for(new x=0;x<3;x++)
		jumpVeloc[id][x] = 0.0
	newButton[id] = 0
	numJumps[id] = 0

	if (id <= 0 || id > 32)
		return
	
	if (g_hooked[id])
		drag_end(id)
}

public harpoon_target(parm[]) // set beam (ex. tongue:) if target is player
{
	new id = parm[0]
	new hooktarget = parm[1]

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(8)	// TE_BEAMENTS
	write_short(id)
	write_short(hooktarget)
	write_short(g_Line)	// sprite index
	write_byte(0)	// start frame
	write_byte(0)	// framerate
	write_byte(200)	// life
	write_byte(8)	// width
	write_byte(1)	// noise
	write_byte(155)	// r, g, b
	write_byte(155)	// r, g, b
	write_byte(55)	// r, g, b
	write_byte(90)	// brightness
	write_byte(10)	// speed
	message_end()
}

public noTarget(id) // set beam if target isn't player
{
	new endorigin[3]

	get_user_origin(id, endorigin, 3)

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte( TE_BEAMENTPOINT ); // TE_BEAMENTPOINT
	write_short(id)
	write_coord(endorigin[0])
	write_coord(endorigin[1])
	write_coord(endorigin[2])
	write_short(g_Line) // sprite index
	write_byte(0)	// start frame
	write_byte(0)	// framerate
	write_byte(200)	// life
	write_byte(8)	// width
	write_byte(1)	// noise
	write_byte(155)	// r, g, b
	write_byte(155)	// r, g, b
	write_byte(55)	// r, g, b
	write_byte(75)	// brightness
	write_byte(0)	// speed
	message_end()
}

public beam_remove(id) // remove beam
{
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(99)	//TE_KILLBEAM
	write_short(id)	//entity
	message_end()
}
public zp_user_infected_pre(id) {
    if(!(get_user_flags(id) & ADMIN_LEVEL_H)) {
        if (zp_get_user_next_class(id) == g_zclass_smoker) {
            zp_set_user_zombie_class(id, 0)
            client_print(id, print_center, "You have selected the VIP class zombie.")
            client_print(id, print_chat, "You are not VIP player.")
        }    
    }
} 
Nume: ZP Class: Arahnid
Versiune: 0.1
Link oficial: -


Instalare:
1. Fisierul zp_zclass_arahnid.sma il puneti in addons/amxmodx/scripting
2. Fisierul zp_zclass_arahnid.amxx il puneti in addons/amxmodx/plugins
3. Intrati in fisierul addons/amxmodx/configs/plugins-zplague.ini si adaugati la urma:

Code: Select all

zp_zclass_arahnid.amxx
4. Alti pasi necesari....

Cvar-uri (se adauga in fisierul amxmodx\configs\amxx.cfg):
zp_smoker_dragspeed 180 (viteza la drag)
zp_smoker_maxdrags 100 (de cate ori poate folosi drag)
zp_smoker_cooldown 5 (cat timp dureaza sa se reincarce)
zp_smoker_dmg2stop 75 (cat damage trebuie sa-ti dea ca sa se elibereze de drag)
zp_smoker_mates 1 (ca sa folosesti puterea pe coechipieri)
zp_smoker_bind 1 (ca sa folosesti bindul)
zp_wallclimb 1 (sa se activeze catararea)
zp_wallclimb_survivor 0 (sa poata folosi puterea si survivorul)
zp_wallclimb_nemesis 1 (sa poata folosi puterea si nemesisul)



Imagini: -
Image
Post Reply

Return to “AmxModX”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 16 guests