Servus, ich nage gerade an meiner Spectate Funktion. Ich möchte es so haben dass wenn der Spieler in ein Fahrzeug steigt, er auch wieder in die Third Person Kamera geht und das wenn er den Interior wechselt, das er den Spieler wieder richtig erfasst. Also wenn ich den Modus "SPECTATE_MODE_FIXED" nutze, funktioniert der Spectate schon mal gar nicht. Lass euch mal meinen Quellcode da.
/spec Befehl
ocmd:spec(playerid, params[])
{
if(pInfo[playerid][pAdmin] < 1)return 1;
if(pInfo[playerid][pSpec] == 1)return SendClientMessage(playerid, COLOR_RED, "FEHLER: {FFFFFF}Du schaust aktuell schon jemanden zu. /unspec um den Modus zu verlassen!");
new id, string[128];
if(sscanf(params, "u", id))return SendClientMessage(playerid, COLOR_GREY, "Befehl: /spec [Name/ID]");
if(IsPlayerLoggedIn(id) == false)return SendClientMessage(playerid, COLOR_RED, "LOGIN: {FFFFFF}Der Spieler muss angemeldet sein!");
format(string, sizeof string, "[ACHAT] %s beobachtet nun %s [ID:%i]", getPlayerName(playerid), getPlayerName(id), id),
SendAdminMessage(COLOR_YELLOW, string, -1);
new Float:myPos[3];
GetPlayerPos(playerid, myPos[0], myPos[1], myPos[2]),
pInfo[playerid][pSpec] = 1,
pInfo[playerid][pSpecID] = id,
pInfo[playerid][pGoBack][OldID] = playerid,
pInfo[playerid][pGoBack][OldPosX] = myPos[0],
pInfo[playerid][pGoBack][OldPosY] = myPos[1],
pInfo[playerid][pGoBack][OldPosZ] = myPos[2],
pInfo[playerid][pGoBack][OldInterior] = GetPlayerInterior(playerid),
pInfo[playerid][pGoBack][OldVirtualWorld] = GetPlayerVirtualWorld(playerid),
pInfo[playerid][pSpecTimer] = SetTimerEx("@specBoxUpdate", 650, true, "i", playerid), //In dem Timer lass ich dann auch den Interior & die VW World Updaten, falls sich was verändert hat.
SetPlayerInterior(playerid, GetPlayerInterior(id)),
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(id)),
ShowPlayerMenu(playerid, MENU_SPEC),
TogglePlayerSpectating(playerid, true),
PlayerSpectatePlayer(playerid, id, SPECTATE_MODE_NORMAL);
return 1;
}
Die State Change
public OnPlayerStateChange(playerid, newstate, oldstate)
{
new mySpecID = GetMySpec(playerid), specVEH = GetPlayerVehicleID(playerid);
if(mySpecID != INVALID_PLAYER_ID)
{
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
{
return PlayerSpectateVehicle(mySpecID, specVEH, SPECTATE_MODE_NORMAL);
}
else if(oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)
{
if(newstate == PLAYER_STATE_ONFOOT)
{
return PlayerSpectatePlayer(mySpecID, playerid, SPECTATE_MODE_NORMAL);
}
}
}
return 1;
}