Skocz do zawartości
roki123h

[Rozwiązane] Ustawienie klawisza użycia mocy (Cod by linux)

Rekomendowane odpowiedzi

Potrzebuje pomocy przy ustawieniu !useclass na przycisk e 

Przez MAGNET,

"Cod by linux to nie jest właściwa nazwa tematu. Cod by linux.....co? nic to nie mówi. Poprawiłem nazwę tematu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dodajesz warunek

 

GetClientButtons(client) & IN_USE)

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie zrobisz na graczu auto bindowania klawisza,  możesz jedynie wykryć jego używanie pod daną klasę 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a to jak jest zrobiony spadochron ze jest przypisany odrazu pod e ?

Edytowane przez roki123h

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Masz podane w drugim poście , musisz edytować klasę i dodać do niej warunek który wykryje użycie danego klawisza

Tutaj masz przykład z pluginu na spadochron

 

void OnButtonPress(int client, int button)
{
  if(IsValidClient(client, true))
  {
    int cFlags = GetEntityFlags(client);
    if(button == IN_USE && g_iParachuteEnt[client] == 0 && IsInAir(client, cFlags)) // Sprawdza czy dany guzik zostal nacisniety
    {
      AttachParachute(client);
    }
  }
}

void OnButtonRelease(int client, int button)
{
  if(IsValidClient(client))
  {
    if(button == IN_USE && g_iParachuteEnt[client] != 0)
    {
      RemoveParachute(client);
    }
  }
}

 

Edytowane przez szogun

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To nigdzie, jest to tylko przykład jak zostało to zrobione w pluginie, albo podasz kod klasy albo sam musisz metodą prób i błędów

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Spoiler
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <codmod>

new const String:nazwa[] = "Wspinacz";
new const String:opis[] = "Posiada line, predkosc wspinania sie po niej (+inteligencja)";
new const String:bronie[] = "#weapon_mac10#weapon_hkp2000#weapon_smokegrenade";
new const inteligencja = 0;
new const zdrowie = 5;
new const obrazenia = 0;
new const wytrzymalosc = 15;
new const kondycja = 10;

new bool:ma_klase[65],
	przylepiona_lina_gracza[65];

new sprite_beam,
	sprite_halo;

public Plugin:myinfo =
{
	name = nazwa,
	author = "Linux`",
	description = "Cod Klasa",
	version = "1.0",
	url = "http://steamcommunity.com/id/linux2006"
};
public OnPluginStart()
{
	cod_register_class(nazwa, opis, bronie, inteligencja, zdrowie, obrazenia, wytrzymalosc, kondycja);
	HookEvent("player_spawn", OdrodzenieGracza);
	HookEvent("player_death", SmiercGracza);
}
public OnMapStart()
{
	PrecacheModel("models/props/de_vertigo/construction_safetyribbon_01.mdl");
	sprite_beam = PrecacheModel("sprites/laserbeam.vmt");
	sprite_halo = PrecacheModel("sprites/glow01.vmt");

	PrecacheSound("weapons/items/ammocrate_close.wav");
}
public cod_class_enabled(client)
{
	ma_klase[client] = true;
}
public cod_class_disabled(client)
{
	ma_klase[client] = false;
	StopLina(client);
}
public cod_class_skill_used(client)
{
	if(przylepiona_lina_gracza[client] > 0)
		StopLina(client);
	else
	{
		przylepiona_lina_gracza[client] = CreateEntityByName("hegrenade_projectile");
		if(przylepiona_lina_gracza[client] != -1)
		{
			if(!cod_get_user_intelligence(client, 1, 0, 0))
				PrintCenterText(client, "Aby wzmocnic moc swojej klasy, zwieksz inteligencje!");

			new Float:forigin[3];
			GetClientEyePosition(client, forigin);

			new Float:fangles[3];
			GetClientEyeAngles(client, fangles);

			new Float:iorigin[3], Float:iangles[3], Float:ivector[3];
			TR_TraceRayFilter(forigin, fangles, MASK_SOLID, RayType_Infinite, TraceRayFilter, przylepiona_lina_gracza[client]);
			TR_GetEndPosition(iorigin);
			DispatchSpawn(przylepiona_lina_gracza[client]);
			ActivateEntity(przylepiona_lina_gracza[client]);
			SetEntityModel(przylepiona_lina_gracza[client], "models/props/de_vertigo/construction_safetyribbon_01.mdl");
			SetEntityMoveType(przylepiona_lina_gracza[client], MOVETYPE_STEP);
			SetEntityGravity(przylepiona_lina_gracza[client], 0.1);
			MakeVectorFromPoints(forigin, iorigin, ivector);
			NormalizeVector(ivector, ivector);
			ScaleVector(ivector, 1000.0);
			GetVectorAngles(ivector, iangles);
			TeleportEntity(przylepiona_lina_gracza[client], forigin, iangles, ivector);
			SetEntProp(przylepiona_lina_gracza[client], Prop_Send, "m_usSolidFlags", 12);
			SetEntProp(przylepiona_lina_gracza[client], Prop_Data, "m_nSolidType", 6);
			SetEntProp(przylepiona_lina_gracza[client], Prop_Send, "m_CollisionGroup", 1);
			SetEntPropEnt(przylepiona_lina_gracza[client], Prop_Send, "m_hOwnerEntity", client);

			CreateTimer(0.1, ThinkLiny, EntIndexToEntRef(przylepiona_lina_gracza[client]), TIMER_FLAG_NO_MAPCHANGE);
			SDKHook(przylepiona_lina_gracza[client], SDKHook_StartTouchPost, DotykLiny);
		}
	}
}
public Action:ThinkLiny(Handle:timer, any:ref)
{
	new ent = EntRefToEntIndex(ref);
	if (ent == -1 || !IsValidEntity(ent))
		return Plugin_Continue;

	new client = GetEntPropEnt(ent, Prop_Send, "m_hOwnerEntity");
	if(!IsValidClient(client))
	{
		AcceptEntityInput(ent, "Kill");
		return Plugin_Continue;
	}

	new Float:forigin[3];
	GetEntPropVector(ent, Prop_Send, "m_vecOrigin", forigin);

	new Float:iorigin[3];
	GetClientEyePosition(client, iorigin);

	if(GetEntityMoveType(ent) == MOVETYPE_NONE)
	{
		new Float:fvelocity[3];
		new Float:fdistance = GetVectorDistance(forigin, iorigin);
		if(fdistance >= 30.0)
		{
			new Float:fspeed = 100.0+RoundFloat(cod_get_user_maks_intelligence(client)*0.5);
			fvelocity[0] = (forigin[0]-iorigin[0])*(2.0*fspeed)/fdistance;
			fvelocity[1] = (forigin[1]-iorigin[1])*(2.0*fspeed)/fdistance;
			fvelocity[2] = (forigin[2]-iorigin[2])*(2.0*fspeed)/fdistance;
		}

		TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fvelocity);
	}

	TE_SetupBeamPoints(forigin, iorigin, sprite_beam, sprite_halo, 0, 0, 0.1, 6.0, 6.0, 0, 0.0, {0, 255, 0, 128}, 0);
	TE_SendToAll();

	CreateTimer(0.1, ThinkLiny, ent, TIMER_FLAG_NO_MAPCHANGE);
	return Plugin_Continue;
}
public Action:DotykLiny(ent, client)
{
	if(!IsValidEntity(ent))
		return Plugin_Continue;

	new attacker = GetEntPropEnt(ent, Prop_Send, "m_hOwnerEntity");
	if(!IsValidClient(attacker) || !ma_klase[attacker])
	{
		AcceptEntityInput(ent, "Kill");
		return Plugin_Continue;
	}
	if(IsValidClient(client) && GetClientTeam(attacker) == GetClientTeam(client))
		return Plugin_Continue;

	if(GetEntityMoveType(ent) != MOVETYPE_NONE)
	{
		SetEntityMoveType(ent, MOVETYPE_NONE);
		EmitSoundToAll("weapons/items/ammocrate_close.wav", ent, SNDCHAN_AUTO, SNDLEVEL_GUNFIRE);
	}

	return Plugin_Continue;
}
public Action:StopLina(client)
{
	if(przylepiona_lina_gracza[client] > 0)
	{
		if(IsValidEntity(przylepiona_lina_gracza[client]))
			AcceptEntityInput(przylepiona_lina_gracza[client], "Kill");

		przylepiona_lina_gracza[client] = 0;
	}

	return Plugin_Continue;
}
public bool:TraceRayFilter(ent, contents)
{
	return false;
}
public Action:OdrodzenieGracza(Handle:event, String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(!IsValidClient(client) || !ma_klase[client])
		return Plugin_Continue;

	StopLina(client);
	return Plugin_Continue;
}
public Action:SmiercGracza(Handle:event, String:name[], bool:dontbroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(!IsValidClient(client) || !ma_klase[client])
		return Plugin_Continue;

	StopLina(client);
	return Plugin_Continue;
}

 

 

Przez Vasto_Lorde,

Długi kod w tag spoiler proszę ^^

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon)
{
	if (buttons & IN_USE)
	{
		ClientCommand(client, "komenda");
	}
	return Plugin_Continue;
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Silnik codmoda jest zbudowany tak, że po użyciu komendy, którą musisz sobie zbindować (useclass, useitem) wywoływana jest funkcja cod_class_skill_used (lub cod_item_used) w klasie/itemie, którego aktualnie używasz.

 

Jeśli chcesz, aby każdy gracz mógł domyślnie używać mocy klasy pod E będziesz musiał zastosować podany przez @Bioły'ego kod. Niestety, Twój problem wynika najprawdopodobniej przynajmniej z jednej spośród dwóch następujących rzeczy:

 

1. Polecenie ClientCommand symuluje wysłanie komendy przez gracza. Jeśli nic w tej linijce nie zmieniłeś, będzie on cały czas spamował komendą "komenda". Czy zmieniałeś zawartość na "useclass"?

2. OnPlayerRunCmd wywołuje się przy każdorazowym wysyłaniu pakietów do serwera - czyli cholernie często. Prawdopodobnie przez to kickuje Cię z serwera z błędem. Aby temu zaradzić, trzeba stworzyć blokadę, która nie będzie pozwalała na ponowne użycie komendy przez gracza (powiedzmy na 0.5 sekundy)

 

Swoją drogą, Twój problem i tak jest nie do rozwiązania posługując się samym przyciskiem E, ponieważ poza klasami są jeszcze perki, które również mają swoje moce... może powinieneś sobie odpuścić i znaleźć dobrą metodę na informowanie swoich graczy i potrzebie wprowadzenia bindów? ?

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poniżej przedstawiam rozwiązanie jak mniej więcej ma wyglądać usunięcie "spamu" komendą przy przyciskaniu IN_USE

public Action OnPreThink(int client)
{
	if (iClientButtons & IN_USE && !(g_iPlayerLastButtons[client] & IN_USE))
	{
		//uzywa sie mocy
	}
	
	g_iPlayerLastButtons[client] = iClientButtons;
}

 

 

Kod zerżnięty z XiaolinModa, ale takie rozwiązanie pojawiało się wiele razy już też w CS 1.6. OnPreThink hookujemy za pomocą SDKhook:

SDKHook(client, SDKHook_PreThink, OnPreThink);

 

 

Do iClientButtons pobieramy aktualne przyciski jakich używa gracz poprzez GetClientButtons
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!, w zmiennej globalnej g_iPlayerLastButtons przetrzymujemy ostatnie naciśnięte przyciski. 


Jak słusznie zauważył @MAGNET nie będziesz mógł tego samego zrobić w przypadku perków, bo metoda której tutaj używamy może wychwytywać tylko i wyłącznie klawisze ruchu (oraz IN_USE domyślnie pod klawisz E), więc co najwyżej mógłbyś zrobić automatyczne użycie perku na przycisk IN_DUCK + IN_JUMP i perk użyłby się przy naciskaniu jednocześnie kucania i skoku

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Pomoc udzielona

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...