Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
roki123h

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

Recommended Posts

Potrzebuje pomocy przy ustawieniu !useclass na przycisk e 

By 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Edited by roki123h

Share this post


Link to post
Share on other sites

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);
    }
  }
}

 

Edited by szogun

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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;
}

 

 

By Vasto_Lorde,

Długi kod w tag spoiler proszę ^^

Share this post


Link to post
Share on other sites
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;
}

 

Share this post


Link to post
Share on other sites

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? ?

 

  • Lubię to! 1

Share this post


Link to post
Share on other sites

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

  • Lubię to! 1

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...