←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Jak pobrać dynamiczny IN_USE

GT Team - zdjęcie GT Team 28.04.2013

Otóż chcę zrobić, by gracz, który jest blisko wieżyczki mógł "podnieść ją" naciskając RAZ klawisz "E". A mógł ją upuśćić ( lecz nie w miejscu, gdzie ono jest zablokowane ) naciskając DRUGI RAZ klawisz "E".

 

Mam taki kod:

new iTime[33];
public client_PreThink(id)
{
    if(!is_user_alive(id) || is_user_hltv(id))
        return PLUGIN_CONTINUE
        
    static entlist[3]
    
    if(find_sphere_class(id, "turret", 10.0, entlist, 2))
    {
        if(is_turret(entlist[0]) && get_gametime() > ThinkTime[id]+0.5 && (get_sentry_owner_by_ent_id(entlist[0]) == id) && !gMenuTurretsInMenu[id] && !task_exists(entlist[0]))
        {
            static Float:Origin[3], fOrigin[3]
            pev(entlist[0], pev_origin, Origin)
            FVecIVec(Origin, fOrigin)
            msg_circle(id, fOrigin, gSpriteLaserBeam, {255, 255, 0}, gTurretsRange[id][get_sentry_id_by_ent(id, entlist[0])]-220)
            ThinkTime[id] = get_gametime()
        }
        if(get_gametime() > ThinkInfoTime[id]+2.0)
        {
            static nick[33], szTemp[64], szTurret[64], id2
            id2 = get_sentry_owner_by_ent_id(entlist[0])
            get_user_name(id2, nick, 32)
            formatex(szTemp, 63, "Wiezyczka gracza: %s", nick)
            
            if(gTurretsType[id2][get_sentry_id_by_ent(id2, entlist[0])])
            {
                formatex(szTurret, 63, "^nTyp : %s^nAmunicja : %d", gTurretName[gTurretsType[id2][get_sentry_id_by_ent(id2, entlist[0])]], gTurretsAmmo[id2][get_sentry_id_by_ent(id2, entlist[0])])
                add(szTemp, 63, szTurret)
            }
            ThinkInfoTime[id] = get_gametime()    
            set_hudmessage(0, 255, 0, 0.31, 0.79, 1, 6.0, 2.0, _, _, 2)
            ShowSyncHudMsg(id, gSync4, szTemp)
        }
            
    }
    if(g_iOwnedEnt[id] && IsMovingEnt[id])
    {
        
        static Float:Origin[3], Float:Origin2[3], GOrigin[3]
        get_user_origin(id, GOrigin, 3)
        
        IVecFVec(GOrigin, Origin)//origin
        IVecFVec(GOrigin, Origin2)//turn
        
        get_origin_from_dist_player(id, 45.0, Origin)
        
        Origin[2]-=36.0
        
        set_pev(g_iOwnedEnt[id], pev_origin, Origin)
        sentry_turntotarget2(g_iOwnedEnt[id], Origin, Origin2)
        
        if(is_turret_stuck(g_iOwnedEnt[id]))
        {
            client_print(id, print_center, "Nie mozesz tutaj postawic tej wiezyczki!")
            CanDropTurret[id] = false
        }
        else
            CanDropTurret[id] = true;
        
        entity_set_float(g_iOwnedEnt[id], EV_FL_nextthink, 0.0)
    }
    
    return PLUGIN_CONTINUE
}


public fw_CmdStart( id, uc_handle, randseed )
{
    if (!is_user_alive(id))
        return FMRES_IGNORED
    
    if((pev(id, pev_button) & IN_USE) && !(pev(id, pev_oldbuttons) & IN_USE))
    {
        LastCanDropTurret[id] = !LastCanDropTurret[id]
        //LastCanDropTurret[id] = LastCanDropTurret[id]?!LastCanDropTurret[id]:LastCanDropTurret[id]
        if(LastCanDropTurret[id])
        {
            iTime[id] = floatround(get_gametime());
            cmdGrabEnt(id)
        }
        if(!LastCanDropTurret[id] && CanDropTurret[id] && ( iTime[id]+1 == floatround(get_gametime()) ))
        {
            cmdStopEnt(id)
        }
    }
    //else if(oldbutton & IN_USE && !(button & IN_USE) && CanDropTurret[id])
    //    cmdStopEnt(id
        
    return FMRES_IGNORED;
}

public cmdGrabEnt(id)
{    
    client_cmd(id, "+use")
    
    new entlist[3]
    new ent
    if(find_sphere_class(id, "turret", 17.5, entlist, 2))
    {
        ent = entlist[0]
    }
    else
        return PLUGIN_HANDLED
    if (!is_valid_ent(ent) || is_user_alive(ent))
        return PLUGIN_HANDLED;
    
    static szClass[10]
    
    entity_get_string(ent, EV_SZ_classname, szClass, 9);
    
    if (!equal(szClass, "turret"))
        return PLUGIN_HANDLED;

    static Float:fOrigin[3], iAiming[3], Float:fAiming[3]
    
    get_user_origin(id, iAiming, 3);
    IVecFVec(iAiming, fAiming);
    entity_get_vector(ent, EV_VEC_origin, fOrigin);

    g_fOffset1[id] = fOrigin[0] - fAiming[0];
    g_fOffset2[id] = fOrigin[1] - fAiming[1];
    g_fOffset3[id] = fOrigin[2] - fAiming[2];

    set_pev(ent,pev_rendermode,kRenderTransColor)
    set_pev(ent,pev_rendercolor, {255, 0, 0})
    set_pev(ent,pev_renderamt, 100.0)
        
    IsMovingEnt[id] = true;
    g_iOwnedEnt[id] = ent
    client_cmd(id, "-use")
    return PLUGIN_HANDLED
}
public cmdStopEnt(id)
{
    //client_cmd(id, "-use")
    if (!g_iOwnedEnt[id])
        return PLUGIN_HANDLED;
    new ent = g_iOwnedEnt[id]

        
    set_pev(ent,pev_rendermode, kRenderNormal)    
    set_pev(ent,pev_rendercolor, {0, 0, 0})
    set_pev(ent,pev_renderamt, 255.0)
    
    g_iOwnedEnt[id] = 0;
    IsMovingEnt[id] = false

    drop_to_floor(ent)
    entity_set_float(ent, EV_FL_nextthink, get_gametime()+0.1)
    return PLUGIN_CONTINUE
}

 

 

O to o co mi chodzi

1. Podchodze do wieżyczki - naciskam klawisz "E"
2. Podnoszę wieżyczke, puszczam klawisz "E" ( client_cmd(id, "+use") )
3. Dalej trzymam tą wieżyczkę
4. Idę w inne miejsce
5. To miejsce jest zablkowane ( is_turret_stuck )
6. Nie mogę postawić tam wieżyczki ( Naciskając drugi raz klawisz "E" )
7. Idę w inne miejsce
8. To miejsce jest dobre i mogę tam postawić wieżyczkę
9. Postawiam wieżyczkę
10. I tak w kółko

 

A ten kod co dałem działa tak:

1. Podchodze do wieżyczki - naciskam klawisz "E"
2. Podnoszę wieżyczke, puszczam klawisz "E" ( client_cmd(id, "+use") )
3. Dalej trzymam tą wieżyczkę
4. Idę w inne miejsce
5. To miejsce jest zablkowane ( is_turret_stuck )
6. Nie mogę postawić tam wieżyczki ( Naciskając drugi raz klawisz "E" )
7. Idę w inne miejsce
8. To miejsce jest dobre i NIE mogę tam postawić wieżyczkę
9. W ogóle nie mogę postawić nigdzie wieżyczki.
10. I tak w kółko

 

Gdy dam restart, żeby podnieść wieżyczkę, musze wpisać komendę do konsoli: "-use"

Czemu tak się dzieję ? Proszę o pomoc.

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 28.04.2013

Winowajcą jest LastCanDropTureet. Co ciekawe, zmienna ta nawet nie wykonuje czynności, którą powinna na logikę wykonywać, patrząc na jej nazwę.

LastCanDropTurret[id] = !LastCanDropTurret[id]

Zamieniasz tutaj na przeciwną wartość nie wiem po co, za każdym razem gdy naciska użytkownik E. Powinieneś chyba zamieniać na określoną wartość dopiero PO pomyślnym wykonaniu czynności, czyli podniesieniu lub upuszczeniu wieżyczki. Druga rzecz, czemu to ma służyć:

( iTime[id]+1 == floatround(get_gametime()) )

 

 


Użytkownik GwynBleidD edytował ten post 28.04.2013 17:35
Odpowiedz

GT Team - zdjęcie GT Team 28.04.2013

1. Masz rację !
2. Że może puścić dopiero po upływie 1 sec, żeby zapobiec pewnemu rodzajowi spamu
edit
Zrobiłem tak:
if((pev(id, pev_button) & IN_USE) && !(pev(id, pev_oldbuttons) & IN_USE))
	{
		if(LastCanDropTurret[id])
		{
			iTime[id] = floatround(get_gametime());
			cmdGrabEnt(id)
			LastCanDropTurret[id] = false
		}
		if(!LastCanDropTurret[id] && CanDropTurret[id] && ( iTime[id]+1 == floatround(get_gametime()) ))
		{
			cmdStopEnt(id)
			LastCanDropTurret[id] = true
		}
	}
A jednak podnoszę, i puszczam - Jest OK. Lecz nie mogę ponownie podnieść, gdyż muszę wpisać komende -use w konsoli. Gdy to zrobię to podnoszę, ale już nigdzie nie mogę jej upuścić ;(
Użytkownik PaTrIcKx edytował ten post 28.04.2013 18:16
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 28.04.2013

Więc przy tym iTime masz dalej błąd. nie powinno być == ale <= jak już albo bez +1, a dać warunek z < samym.

 

Co do konieczności wpisania -use, nie widzę nic co by powodowało taki błąd...

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 28.04.2013

Jednego nie rozumiem, po co w kodzie
client_cmd(id, "+use")

Przecież jest to zbędne, według mnie podnoszenie i upuszczanie można po prostu zrobić na przycisk E w taki sposób, że podchodzimy, naciskamy E (na chwilę), podnosimy, naciskamy jeszcze raz E i upuszczamy, jeśli oczywiście można. A jeszcze co do tego -use, to po prostu gdy puszczasz e, to wykonuje się ta komenda, więc skoro w kodzie masz +use, to trzeba też gdzieś mieć -use.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 29.04.2013

Fakt. Nawet nie zauważyłem tego durnego +use... po co to?

Odpowiedz

GT Team - zdjęcie GT Team 29.04.2013

Bo trzymanie wieżyczki jest na klawiszu E, to +use symuluje trzymanie tej wieżyczki, a -use (po naciśnięciu drugi raz klawisza E) puszcza ją. Gdyby tego +use nie było, to bym musiał cały czas trzymać E, a jednak chcę się tego pozbyć.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 29.04.2013

Bo trzymanie wieżyczki jest na klawiszu E, to +use symuluje trzymanie tej wieżyczki, a -use (po naciśnięciu drugi raz klawisza E) puszcza ją. Gdyby tego +use nie było, to bym musiał cały czas trzymać E, a jednak chcę się tego pozbyć.

Jak dobrze zrobisz, to nie trzeba będzie nic trzymać i nie trzeba żadnego +use w kodzie.
Odpowiedz

GT Team - zdjęcie GT Team 29.04.2013

Sebul, ważne, że zrobiłem i działa :) ( działało dopóki.. ) Teraz dałem, że gdy wieżyczka nie może być postawiona w tym miejscu to model wieżyczki zmienia się na czerwony, a gdy może to na zielony. Działa, lecz tylko 1 raz mogę zrobić to wieżyczce. WTF? Player Think:
if(g_iOwnedEnt[id] && IsMovingEnt[id])
	{
		
		static Float:Origin[3], Float:Origin2[3], GOrigin[3]
		get_user_origin(id, GOrigin, 3)
		
		IVecFVec(GOrigin, Origin)//origin
		IVecFVec(GOrigin, Origin2)//turn
		
		get_origin_from_dist_player(id, 45.0, Origin)
		
		Origin[2]-=36.0
		
		set_pev(g_iOwnedEnt[id], pev_origin, Origin)
		sentry_turntotarget2(g_iOwnedEnt[id], Origin, Origin2)
		
		if(is_turret_stuck(g_iOwnedEnt[id]) || ((find_sphere_class(g_iOwnedEnt[id], "turret", 47.5, entlist2, 2)) && (entlist2[0] != g_iOwnedEnt[id])))
		{
			client_print(id, print_center, "Nie mozesz tutaj postawic tej wiezyczki!")
			entity_set_model(g_iOwnedEnt[id], "models/TD/sentrygun_4.mdl") // normalny model
			CanDropTurret[id] = false
		}
		else
		{
			entity_set_model(g_iOwnedEnt[id], "models/TD/sentrygun_2.mdl") // zielony model
			CanDropTurret[id] = true;
		}
		
		entity_set_float(g_iOwnedEnt[id], EV_FL_nextthink, 0.0)
	}
CmdStart
if((pev(id, pev_button) & IN_USE) && !(pev(id, pev_oldbuttons) & IN_USE))
	{
		client_print(0, 3, "use")
		if(LastCanDropTurret[id])
		{
			client_print(0, 3, "grab")
			iTime[id] = floatround(get_gametime());
			cmdGrabEnt(id)
			LastCanDropTurret[id] = false
		}
		if(!LastCanDropTurret[id] && CanDropTurret[id] && ( iTime[id]+1 <= floatround(get_gametime()) ))
		{
			client_print(0, 3, "stop")
			cmdStopEnt(id)
			LastCanDropTurret[id] = true
		}
	}
Grab + Stop
public cmdGrabEnt(id)
{	
	new entlist[3]
	new ent
	client_print(0, 3, "grav pre")
	
	if(find_sphere_class(id, "turret", 17.5, entlist, 2))
	{
		if(is_turret(entlist[0]))
			ent = entlist[0]
		else if(is_turret(entlist[1]))
			ent = entlist[1]
		else if(is_turret(entlist[2]))
			ent = entlist[2]
		else
			return PLUGIN_CONTINUE
		if (!pev_valid(ent))
			return PLUGIN_CONTINUE
	}
	else
		return PLUGIN_CONTINUE
	
	static Float:fOrigin[3], iAiming[3], Float:fAiming[3]
	
	new turret = get_sentry_id_by_ent(id, ent)
	
	entity_get_string(ent, EV_SZ_model, gTurretsGrabTempModel[id][turret], 63)
	
	get_user_origin(id, iAiming, 3);
	IVecFVec(iAiming, fAiming);
	entity_get_vector(ent, EV_VEC_origin, fOrigin);

	g_fOffset1[id] = fOrigin[0] - fAiming[0];
	g_fOffset2[id] = fOrigin[1] - fAiming[1];
	g_fOffset3[id] = fOrigin[2] - fAiming[2];
	
	set_pev(ent,pev_rendermode,kRenderTransColor)
	set_pev(ent,pev_rendercolor, {0, 0, 0})
	set_pev(ent,pev_renderamt, 100.0)
	
	IsMovingEnt[id] = true;
	g_iOwnedEnt[id] = ent
	
	client_cmd(id, "+use")
	client_cmd(id, "-use")
	client_print(0, 3, "grab post")
	return PLUGIN_CONTINUE
}
public cmdStopEnt(id)
{
	client_print(0, 3, "stop pre")
	if (!g_iOwnedEnt[id] || !IsMovingEnt[id])
		return PLUGIN_CONTINUE
	
	new ent = g_iOwnedEnt[id]
	
	new turret = get_sentry_id_by_ent(id, g_iOwnedEnt[id])
	entity_set_model(g_iOwnedEnt[id], gTurretsGrabTempModel[id][turret])
	entity_set_string(g_iOwnedEnt[id], EV_SZ_classname, "turret")
	
	set_pev(ent,pev_rendermode, kRenderNormal)	
	set_pev(ent,pev_rendercolor, {0, 0, 0})
	set_pev(ent,pev_renderamt, 255.0)
	
	g_iOwnedEnt[id] = 0;
	IsMovingEnt[id] = false

	drop_to_floor(ent)
	entity_set_float(ent, EV_FL_nextthink, get_gametime()+0.1)
	
	client_print(0, 3, "stop post")
	return PLUGIN_CONTINUE
}
I tutaj jak to wychodzi. 1 raz zmienie pozycję wieżyczk i działa czyli:
use
grab
grav pre
grab post
use
stop
stop pre
stop post
a tutaj, jak chcę zrobić kolejny raz:
use
grab
grav pre
Sprawdzałem już różne metody. Gdy usunę zmienianie modelu ( czerwony, zielony + przywracanie w cmdStopEnt ) to wszystko pięknie działa !
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 03.05.2013

Z tym +use jest rozwiązanie beznadziejne. To tak jakbyś związywał komuś rękę, żeby nie puścił wieżyczki, zamiast mu powiedzieć "nie puszczaj". Zrób to na tzw toggle. Z tym kodem Ci nie pomogę, gdyż przez to +use nie da się do końca przewidzieć co się dzieje, a przynajmniej nie chce mi się, bo robisz to bardzo brzydko...

Odpowiedz

GT Team - zdjęcie GT Team 04.05.2013

Ok, możesz mnie bardziej na kierować na to 'toogle' ?
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 04.05.2013

Ok, możesz mnie bardziej na kierować na to 'toogle' ?

Czyli to co już zostało tutaj napisane, naciskasz raz - podnosisz, naciskasz drugi raz - upuszczasz.
Odpowiedz

GT Team - zdjęcie GT Team 04.05.2013

Tylko, to podnoszenie jest w PreThink(id), to mam stworzyc zmienną Podnosi[id] = true, a w thinku jezeli true to trzyma ?
sebul (04.05.2013 13:35):
No coś takiego trzeba zrobić.
Odpowiedz