Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Shootweapon


  • Zamknięty Temat jest zamknięty
2 odpowiedzi w tym temacie

#1 Grycuk

    Zaawansowany

  • Użytkownik

Reputacja: 16
Początkujący

  • Postów:113
  • GG:
  • Steam:steam
  • Imię:Kamil
  • Lokalizacja:Minsk Mazowiecki
Offline

Napisano 21.09.2009 12:50

Witam mam prosbe o przerobienie pluginu shootwepons tak aby nie dzialal na bombie chodzi poniewaz ct chowa pake i to denerwuje :P
#include <amxmodx>

#include <amxmisc>

#include <fakemeta>



#define PLUGIN "Shoot Weapons (Weapon Physics)"

#define VERSION "1.0"

#define AUTHOR "Nomexous"



/*



This plugin requires Weapon Physics to work. Get it here: http://forums.alliedmods.net/showthread.php?t=66472



For an explanation of my method, please go to the end of the plugin.



Version 1.0

 - Initial release.



*/



new fid = 0



public plugin_init()

{

	register_plugin(PLUGIN, VERSION, AUTHOR)

	

	fid = register_forward(FM_TraceLine, "fw_traceline")

	

	register_concmd("amx_shoot_weapons", "concmd", ADMIN_SLAY, "Turn the shoot weapons command on or off.")

}



public concmd(id, level, cid)

{

	if (!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED

	

	new cmd[3]

	read_argv(1, cmd, 2)

	

	if (str_to_num(cmd))

	{

		if (!fid)

		{

			fid = register_forward(FM_TraceLine, "fw_traceline")

			client_print(id, print_console, "Shooting of weapons enabled.")

		}

		else

		{

			client_print(id, print_console, "Shooting of weapons already enabled.")

		}

	}

	else

	{

		if (fid)

		{

			unregister_forward(FM_TraceLine, fid)

			fid = 0

			client_print(id, print_console, "Shooting of weapons disabled.")

		}

		else

		{

			client_print(id, print_console, "Shooting of weapons also disabled.")

		}

	}

	

	return PLUGIN_HANDLED

}



public fw_traceline(Float:start[3], Float:end[3], conditions, id, trace)

{

	// Spectators don't need to run this.

	if (!is_user_alive(id)) return FMRES_IGNORED

	

	// If we hit a player, don't bother searching for an item nearby.

	if (is_user_alive(get_tr2(trace, TR_pHit))) return FMRES_IGNORED

	

	static Float:endpt[3], tr = 0, i

	

	get_tr2(trace, TR_vecEndPos, endpt)

	

	i = 0

	

	while ((i = engfunc(EngFunc_FindEntityInSphere, i, endpt, 20.0)))

	{

		if (is_shootable_ent(i))

		{

			engfunc(EngFunc_TraceModel, start, end, HULL_POINT, i, tr)

		

			if (pev_valid(get_tr2(tr, TR_pHit)))

			{

				get_tr2(tr, TR_vecEndPos, endpt)

				set_tr2(trace, TR_vecEndPos, endpt)

				

				set_tr2(trace, TR_pHit, i)

				

				return FMRES_IGNORED

			}

		}

	}

	

	return FMRES_IGNORED

}



public is_shootable_ent(ent)

{

	if (!pev_valid(ent)) return false

	

	static classname[32]

	pev(ent, pev_classname, classname, 31)

	

	if (equal(classname, "weaponbox") || equal(classname, "armoury_entity") || equal(classname, "weapon_shield") || equal(classname, "item_thighpack"))

	{

		return true

	}

	return false

}



/*



Here's the difficulty in shooting weapons: they don't block traceline. If they can't block traceline, that means

they can't register as a hit. My method currently works by hooking traceline and checking for and items within a

certain radius of the endpoint. If it does find an item, a tracemodel is run. It goes the same path as the

traceline does, and sees if it hits the item. If it does, it alters the trace result to show that it's hitting

the item. The Weapon Physics plugin will handle it from there.



The one thing that irks me is that a "while" loop has to be run in the traceline forward. I'm not sure how

expensive that "while" loop actually is, but it can't be good, because traceline is called constantly. Not to

mention we have to find the classname of each item found each FindEntityInSphere. Maybe it isn't as CPU intensive

as I'm thinking it is, but there's definitely an increase.



EngFunc_Tracemodel is not well documented, so I'm doing it here for future reference:



engfunc(EngFunc_TraceModel, const Float:start[3], const Float:end[3], hull, ent_to_hit, traceresult)



start[3]    - Where to start the trace.

end[3]      - Where to trace to.

hull        - Takes the HULL_* constants. Basically, you're moving a certain sized object along the line until you

              collides with something. HULL_POINT moves a single point from start[3] to end[3] (making it almost

	      like traceline). HULL_HEAD moves a ducking player-sized hull along from start[3] to end[3] until

	      part of that hull hits something. HULL_HUMAN is a standing person, and HULL_LARGE I have no idea.

ent_to_hit  - The entity you want to hit. Tracemodel will ignore everything else. Don't set this to 0 or -1; you'll

              crash the server.

traceresult - Our trace result handle. Use get_tr2() and set_tr2().



*/

  • +
  • -
  • 0

#2 mgr inż. Pavulon

    C35H60Br2N2O4

  • Przyjaciel

Reputacja: 1725
Godlike

  • Postów:6881
  • Steam:steam
  • Imię:Konrad
  • Lokalizacja:Koniecpol
Offline

Napisano 21.09.2009 15:54

Grycuk, możesz spróbować zmienić funkcję is_shootable_ent(ent) na taką:
public is_shootable_ent(ent)
{
	if (!pev_valid(ent)) return false
	
	static classname[32]
	pev(ent, pev_classname, classname, 31)
	
	if (equal(classname, "weaponbox") || equal(classname, "armoury_entity") || equal(classname, "weapon_shield") || equal(classname, "item_thighpack"))
	{
		static modelname[33]
		pev(ent, pev_model, modelname, 32)
		if (contain(modelname, "backpack")!=-1) return false
			
		return true
	}
	return false
}

Wydaje mi się że powinno działać.
  • +
  • -
  • 0

#3 Grycuk

    Zaawansowany

  • Autor tematu
  • Użytkownik

Reputacja: 16
Początkujący

  • Postów:113
  • GG:
  • Steam:steam
  • Imię:Kamil
  • Lokalizacja:Minsk Mazowiecki
Offline

Napisano 21.09.2009 19:03

zaraz zobaczymy ,wrócę z editem

@Edit czy Pavulon jest wielki ? YEAH :)

DZIALA
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych