Jump to content
  • 0

pomoc Změna interiéru


Franta95

Dotaz

Zdravím,

mám menší problém s pozicí při změně interiéru, nejsem v pawnu ještě tak pokročilý, ale zarazilo mě chování kodu při změně interiéru. Takže k věci, v příkazu na port do města mám řádek, aby se hráči nastavil interiér na 0, pro případ, že by v nějakém byl. V publicu On Interior Change se mi při přechodu do interiéru 0 nastaví pozice hráče před budovu do které vešel. Ale při portu tu pozici znovu měním na pozici místa portu, ale hráč se mi stejně přesune před budovu. Nejdřív mi tedy proběhne warp a až potom změna interiéru, přitom v kodu mám jako první změnu interiéru a když jsem si přidal pomocné výpisy, výsledek funkce mi to vrátí hned, ale výpis z publicu, takže i public proběhne až na konci příkazu. Přijde mi to trochu nelogické a v jiných jazycích se mi tohle nikdy nestalo, přikládám kod a obrázek s výpisem, snad je jasné o co mi jde.

 

Provizorní příkaz warpu:

	if (strcmp("/lv", cmd, true) == 0){
		
		new result = SetPlayerInterior(playerid, 0); /////////
		
////////////////výpis z obrázku, mám výsledek funkce, ale proběhne až na konci příkazu
		format(infoText, sizeof(infoText), "result = %i", result);
		SendClientMessage(playerid, CH_GREEN, infoText);
		
		new Float: x = 2179.9055;
		new Float: y = 1988.3667;
		new Float: z = 10.5474;
		
		if (IsPlayerInAnyVehicle(playerid)){
		    SetVehiclePos(GetPlayerVehicleID(playerid), x, y, z);
		}else{
		    SetPlayerPos(playerid, x, y, z);
		}
		
		format(infoText, sizeof(infoText), "Hráč "CE_PORT_TEXT_H"%s "CE_PORT_TEXT"se právě portnul do města "CE_PORT_TEXT_H"Las Venturas", players[playerid][playerName]);
		SendClientMessageToAll(CH_PORT_TEXT, infoText);
	    return 1;
	}

Co proběhne v Interior Change:

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    if (oldinteriorid == 0){
        GetPlayerPos(playerid, players[playerid][lastX], players[playerid][lastY], players[playerid][lastZ]);
        GetPlayerFacingAngle(playerid, players[playerid][lastAng]);
    }
	
	if (oldinteriorid != 0 && players[playerid][lastPickup] != -1){
		new enterid = players[playerid][lastPickup];
		new exitid = pickups[enterid][pcpModel];
		pickups[enterid][pcpType] --;
		if (pickups[enterid][pcpType] <= 0){
			DestroyPickup(exitid);
			pickups[enterid][pcpModel] = -1;
		}
		players[playerid][lastPickup] = -1;
		/////////
///////////////////////
////////////////// červený výpis z obrázku

		SendClientMessageToAll(CH_RED, "Info Exit:");
		format(infoText, sizeof(infoText), "exitid = %i", pickups[enterid][pcpModel]);
		SendClientMessageToAll(CH_RED, infoText);
		format(infoText, sizeof(infoText), "players = %i", pickups[enterid][pcpType]);
		SendClientMessageToAll(CH_RED, infoText);
		format(infoText, sizeof(infoText), "last Pickup(%i) = %i", playerid, players[playerid][lastPickup]);
		SendClientMessageToAll(CH_RED, infoText);
		
	}
	

    if (newinteriorid == 0){
////////nastavení pozice před budovu
		SetPlayerVirtualWorld(playerid, 0);
        players[playerid][lastX] -= 2 * floatsin(-players[playerid][lastAng], degrees);
        players[playerid][lastY] -= 2 * floatcos(-players[playerid][lastAng], degrees);
        SetPlayerFacingAngle(playerid, players[playerid][lastAng] + 180);
        SetPlayerPos(playerid, players[playerid][lastX], players[playerid][lastY], players[playerid][lastZ]);
    }
	
	return 1;
}

Obrázek s výpisem:

červený výpis by měl podle kodu proběhnout nad řádkem result = 1(proběhne funkce - výpis uvnitř a až potom by měl být znám výsledek funkce...) a warp proběhnout až potom

(není důležitý obsah výpisu, ale pořadí vzhledem k zapsanému kodu)

 

interier415645345.png

Link to comment
Share on other sites

11 odpovědí na tuto otázku

Recommended Posts

  • 0
  • Globální moderátor

Možná je tam nějaká odezva než se callback zavolá. Zkus celej ten SetPlayerPos hodit do timeru 800ms.

 

Při nejhorším si zkus vytvořit vlastní fci SetPlayerInterior2, kde budeš všechny tyhle věci provádět.

Link to comment
Share on other sites

  • 0

Pokud se nepletu nastavujes hraci ze pokud neni ve vozidle tak portnes vozidlo a pokud jr tak portnes hrace viz

if (IsPlayerInAnyVehicle(playerid)){

SetVehiclePos(GetPlayerVehicleID(playerid), x, y, z);

}else{

SetPlayerPos(playerid, x, y, z);

}

Link to comment
Share on other sites

  • 0

Pokud se nepletu nastavujes hraci ze pokud neni ve vozidle tak portnes vozidlo a pokud jr tak portnes hrace viz

if (IsPlayerInAnyVehicle(playerid)){

SetVehiclePos(GetPlayerVehicleID(playerid), x, y, z);

}else{

SetPlayerPos(playerid, x, y, z);

}

Ak sa nemýlim ja tak to znamená

AK JE HRÁČ V DANOM VOZIDLE !

(portne vozidlo na x  y  z !)

opak

Portne Hráča na X Y Z

Link to comment
Share on other sites

  • 0

Příkaz je funkční, pokud hráč není v interiéru. Navíc tady nejde o to jestli je ve vozidle...

 

Možná je tam nějaká odezva než se callback zavolá. Zkus celej ten SetPlayerPos hodit do timeru 800ms.

 

Při nejhorším si zkus vytvořit vlastní fci SetPlayerInterior2, kde budeš všechny tyhle věci provádět.

Až dneska přijdu, zkusím to nějak s tím timerem, děkuji za radu.

Link to comment
Share on other sites

  • 0
  • Globální moderátor

Když jsme u těch syntaxů, tak jste oba mimo...

 

 

Pokud je hráč v NĚJAKÉM vozidle, zjistí se jeho vehicleID a portne jeho vozidlo.

Link to comment
Share on other sites

  • 0

Když jsme u těch syntaxů, tak jste oba mimo...

 

 

Pokud je hráč v NĚJAKÉM vozidle, zjistí se jeho vehicleID a portne jeho vozidlo.

Tak nejak som to myslel len ma nenapdo ako to povedať tak som to napísal tak :d prepač no 

Link to comment
Share on other sites

  • 0

Asi takhle.

OnPlayerInteriorChange se muze vyvolat kdyz vchazi do interieru a nebo kdyz uz v nem je. Zalezi natom jak rychle packeta dorazi, proto je potreba pocitat s obema alternativama.

 

A potom dalsi vec:

Pokud hrac vejde do te sipky a behem te defaultni animace se pokousis pouzit SetPlayerPos tak to hrace nepresune. Myslim ze tyhle dve veci vysvetluji vsechny ty "zvlastni" veci ktere popisujes :)

Link to comment
Share on other sites

  • 0

Asi takhle.

OnPlayerInteriorChange se muze vyvolat kdyz vchazi do interieru a nebo kdyz uz v nem je. Zalezi natom jak rychle packeta dorazi, proto je potreba pocitat s obema alternativama.

 

A potom dalsi vec:

Pokud hrac vejde do te sipky a behem te defaultni animace se pokousis pouzit SetPlayerPos tak to hrace nepresune. Myslim ze tyhle dve veci vysvetluji vsechny ty "zvlastni" veci ktere popisujes :)

 

Problém neni při vchodu do šipky, ale při použití příkazu pro port, když už hráč v interiéru je.

 

Každopádně všem děkuji za rady a problém jsem vyřešil hned díky prvnímu příspěvku. Port jsem dal do timeru a funguje to jak má, ještě jednou díky a problém považujte za vyřešený.

Link to comment
Share on other sites

  • 0

new Float: x = 2179.9055;
new Float: y = 1988.3667;
new Float: z = 10.5474;

players[playerid][lastX] = x;

players[playerid][lastY] = y;

players[playerid][lastZ] = z;

SetPlayerInterior(playerid, 0);

 

Nepomôhlo by to? :d :d :d

 

alebo ešte lepšie pridať kontrolu či hráč v poslednej dobe nepoužil nejaký warp (SetPVarInt(playerid, "warp", gettime()+5); - if(GetPVarInt(playerd, "warp") >= gettime())

Edited by Quiter
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...