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)