Skocz do zawartości

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

Jak pobrać dynamiczny IN_USE


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
12 odpowiedzi w tym temacie

#1 GT Team

    Ten lepszy xD

  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 28.04.2013 16:29

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.


Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 28.04.2013 17:34

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

  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#3 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 28.04.2013 17:49

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

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#4 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 28.04.2013 23:05

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


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#5 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 28.04.2013 23:38

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.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#6 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 29.04.2013 13:49

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


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#7 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 29.04.2013 15:24

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ć.

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#8 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 29.04.2013 16:27

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.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#9 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 29.04.2013 18:36

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 !

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#10 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 03.05.2013 22:51

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


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#11 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 04.05.2013 10:22

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

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#12 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 04.05.2013 13:00

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.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#13 GT Team

    Ten lepszy xD

  • Autor tematu
  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 04.05.2013 13:34

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ć.

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 





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

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