Wie kann ich den Speed vom Fahrzeug und den Zustand abfragen?
Ich hab langsam das Gefühl du hast überhaupt keine Ahnung was du da tust. Eigne dir mal bitte die Basics an.
Dabei ist das SAMP Wiki für jeden zugänglich, egal ob erfahren oder anfänger. ![]()
Wie kann ich den Speed vom Fahrzeug und den Zustand abfragen?
Ich hab langsam das Gefühl du hast überhaupt keine Ahnung was du da tust. Eigne dir mal bitte die Basics an.
Dabei ist das SAMP Wiki für jeden zugänglich, egal ob erfahren oder anfänger. ![]()
Ich hab ja schon ein Teil ![]()
Also wenn der Spieler in das Auto einsteigt wird ein Timer gestartet der das aufruft:
forward GetVehicleSpeed(playerid);
public GetVehicleSpeed(playerid)
{
new vID = GetPlayerVehicleID(playerid);
VehicleSpeed(vID);
return vID;
}
Vehicle Speed:
stock VehicleSpeed(vehicleid)
{
new Float:xPos[3];
GetVehicleVelocity(vehicleid, xPos[0], xPos[1], xPos[2]);
return floatround(floatsqroot(xPos[0] * xPos[0] + xPos[1] * xPos[1] + xPos[2] * xPos[2]) * 170.00);
}
format(tcn1, sizeof(tcn), "%d", GetVehicleSpeed(playerid));
PlayerTextDrawSetString(playerid, Tacho9[playerid], tcn1);
Leider Funktioniert es nicht ![]()
Alles anzeigenforward GetVehicleSpeed(playerid);
public GetVehicleSpeed(playerid)
{
new vID = GetPlayerVehicleID(playerid);
VehicleSpeed(vID);
return vID;
}
Es reicht hier einfach:
Funktioniert immer noch nicht. Steht nur im Textdraw eine 1
du musst das TextDraw auch aktuallisieren lassen, sobald sich die Geschwindigkeit ändert.
Warum überhaupt einen separaten Funktionsaufruf?
format(tcn1, sizeof(tcn), "%d", GetVehicleSpeed(playerid));
Zu:
format(tcn1, sizeof(tcn1), "%d", VehicleSpeed(GetPlayerVehicleID(playerid)));
Das public GetVehicleSpeed kann dann gelöscht werden.
Den Code mit dem PlayerTextDrawSetString dann in einen Timer setzen, der jede Sekunde aufgerufen wird und für alle Spieler eine Schleife enthält.
Dann muss ich ja den Timer ändern oder?
Kommt drauf an wie er und sein public dazu aktuell aussehen.
Ja hat sich erledigt danke. Wie Health Float vom Auto wie kann man die umrechnen? dass die nur von 100 -0 geht anstatt von 1000-0
new intHealth = floatround((vHealth - 250.0) / 7.5);
CMD:lieferung(playerid, params[])
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid) == 428)
{
ShowPlayerDialog(playerid, DIALOG_LIEFERUNGW, DIALOG_STYLE_LIST, "Transport GmbH - Firmen Übersicht", "Waffenkammer LSPD\nWaffenkammer FBI\nWaffenkammer LVPD", "GPS", "Schließen");
}
if(GetVehicleModel(vehicleid) == 515 || GetVehicleModel(vehicleid) == 514)
{
if(GetVehicleModel(GetVehicleTrailer(vehicleid)) == 435)
{
ShowPlayerDialog(playerid, DIALOG_LIEFERUNGP, DIALOG_STYLE_LIST, "Transport GmbH - Firmen Übersicht","Ammunation LS\nAmmunation SF\nAmmunation LV\nTelefon BIZ\nHaus Upgrade\nWerbeagentur\nSupermarkt\nPaintball\nKart Bahn\nFahrzeuglackiererei","GPS", "Schließen");
}
}
if(GetVehicleModel(vehicleid) == 515 || GetVehicleModel(vehicleid) == 514) //Geht nicht
{
if(GetVehicleModel(GetVehicleTrailer(vehicleid)) == 584)
{
ShowPlayerDialog(playerid, DIALOG_LIEFERUNGT, DIALOG_STYLE_LIST, "Transport GmbH - Tankstellen Übersicht","Temple Station\nIdlewood\nFlint County\nWhetstone\nDoherty\nJuniper Hill\nAngel Pine\nEaster Basin\nEmerald Isle\nBone County\nTierra Robada\nFort Carson","GPS", "Schließen");
}
}
return 1;
}
Alles anzeigen
Hallo,
Ich habe ein Problem wen ich jetzt ein LKW und den Tanker angehängt habe,
kann ich nicht /lieferung machen bei den anderen 2 Funktioniert es?
CMD:lieferung(playerid, params[])
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid) == 428)
{
ShowPlayerDialog(playerid, DIALOG_LIEFERUNGW, DIALOG_STYLE_LIST, "Transport GmbH - Firmen Übersicht", "Waffenkammer LSPD\nWaffenkammer FBI\nWaffenkammer LVPD", "GPS", "Schließen");
}
else if(GetVehicleModel(vehicleid) == 515 || GetVehicleModel(vehicleid) == 514)
{
if(GetVehicleModel(GetVehicleTrailer(vehicleid)) == 435)
{
ShowPlayerDialog(playerid, DIALOG_LIEFERUNGP, DIALOG_STYLE_LIST, "Transport GmbH - Firmen Übersicht","Ammunation LS\nAmmunation SF\nAmmunation LV\nTelefon BIZ\nHaus Upgrade\nWerbeagentur\nSupermarkt\nPaintball\nKart Bahn\nFahrzeuglackiererei","GPS", "Schließen");
}
}
else if(GetVehicleModel(vehicleid) == 515 || GetVehicleModel(vehicleid) == 514) //Geht nicht
{
if(GetVehicleModel(GetVehicleTrailer(vehicleid)) == 584)
{
ShowPlayerDialog(playerid, DIALOG_LIEFERUNGT, DIALOG_STYLE_LIST, "Transport GmbH - Tankstellen Übersicht","Temple Station\nIdlewood\nFlint County\nWhetstone\nDoherty\nJuniper Hill\nAngel Pine\nEaster Basin\nEmerald Isle\nBone County\nTierra Robada\nFort Carson","GPS", "Schließen");
}
}
return 1;
}
Alles anzeigen
probiere es mal so ![]()
Hab mal nach langer Zeit bissel rumgebastelt. Hab mir jetzt ein rob System gebastelt wo der Spieler auf einem Actor zielen muss. Momentan ist das alles (also die Abfragen ob er auf dem actor zielt) in OnPlayerUpdate. Ist jetzt die Frage ob das OnPlayerUpdate mit noch kA 10 weiteren Abfragen mitmacht oder ob es Sinnvoller bzw es reicht nen timer zu nutzen. Der Raub soll Fehlschlagen sobald man zB nicht mehr auf den Actor zielt.
Momentan sieht der Code so aus:
public OnPlayerUpdate(playerid)
{
// No need to check if we aren't allowed to rob anyway
if(!IsAlive(playerid)) return 1;
if(IsACop(playerid)) return 1;
if(IsJailed(playerid)) return 1;
if(GetPlayerInterior(playerid) == 0) return 1;
new actor = GetPlayerTargetActor(playerid);
new weapon = GetPlayerWeapon(playerid);
new string[128];
if(actor != INVALID_ACTOR_ID)
{
if(actor == Actors[8] && IsPlayerInDynamicCP(playerid, CP_SexShopRobbery) && RobbedSexShopRecently == 0 && pInfo[playerid][RobbingStore] == 0)
{
if(IsValidAimWeapon(weapon))
{
if(ActorHandsUp[actor] == false) // REMOVE ME
{
ActorHandsUp[actor] = true; // REMOVE ME
RobbedSexShopRecently = 240;
pInfo[playerid][RobbingStore] = 30;
ApplyActorAnimation(actor, "SHOP", "SHP_HandsUp_Scr",4.1,0,0,0,1,0);
ApplyActorAnimation(actor, "SHOP", "SHP_HandsUp_Scr",4.1,0,0,0,1,0);
GiveWanted(playerid, 4);
format(string,sizeof(string),"**(DISPATCH STORE ROBBERY IN PROGRESS)** Suspect: %s(%d)",pInfo[playerid][Name],playerid);
SendMessageToAllCops(string,playerid,true); // play crime report
SendMessageToAllCops("ALL UNITS: Please respond to the sex shop in Redsands East");
format(string,sizeof(string),"(SEX SHOP ROBBERY) Wanted Level: %d",GetWanted(playerid));
SendClientMessage(playerid,GetPlayerColor(playerid),string);
SendClientMessage(playerid,0x00C7FFAA,"Starting robbery. The police have been advised and will be dispatched to this store");
format(string,sizeof(string),"~w~ROBBERY IN PROGRESS~n~~r~KEEP AIMING AT THE CASHIER~n~~b~30~w~ SECONDS REMAIN");
GameTextForPlayer(playerid,string, 2000, 3);
}
}
}
else if(actor == Actors[9] && IsPlayerInDynamicCP(playerid, CP_TattooRobbery) && RobbedTattooShopRecently == 0 && pInfo[playerid][RobbingStore] == 0)
{
if(IsValidAimWeapon(weapon))
{
if(ActorHandsUp[actor] == false)// REMOVE ME
{
ActorHandsUp[actor] = true;// REMOVE ME
RobbedTattooShopRecently = 240;
pInfo[playerid][RobbingStore] = 30;
ApplyActorAnimation(actor, "SHOP", "SHP_HandsUp_Scr",4.1,0,0,0,1,0);
ApplyActorAnimation(actor, "SHOP", "SHP_HandsUp_Scr",4.1,0,0,0,1,0);
GiveWanted(playerid, 4);
format(string,sizeof(string),"**(DISPATCH STORE ROBBERY IN PROGRESS)** Suspect: %s(%d)",pInfo[playerid][Name],playerid);
SendMessageToAllCops(string,playerid,true); // play crime report
SendMessageToAllCops("ALL UNITS: Please respond to the tattoo shop in Redsands East");
format(string,sizeof(string),"(TATTOO SHOP ROBBERY) Wanted Level: %d",GetWanted(playerid));
SendClientMessage(playerid,GetPlayerColor(playerid),string);
SendClientMessage(playerid,0x00C7FFAA,"Starting robbery. The police have been advised and will be dispatched to this store");
format(string,sizeof(string),"~w~ROBBERY IN PROGRESS~n~~r~KEEP AIMING AT THE CASHIER~n~~b~30~w~ SECONDS REMAIN");
GameTextForPlayer(playerid,string, 2000, 3);
}
}
}
}
else if(pInfo[playerid][RobbingStore] > 0 && IsValidAimWeapon(weapon))
{
pInfo[playerid][RobbingStore] = 0;
if(IsPlayerInDynamicCP(playerid, CP_SexShopRobbery))
{
ClearActorAnimations(Actors[8]);
ActorHandsUp[Actors[8]] = false;// REMOVE ME
}
else if(IsPlayerInDynamicCP(playerid, CP_TattooRobbery))
{
ClearActorAnimations(Actors[9]);
ActorHandsUp[Actors[9]] = false;// REMOVE ME
}
GameTextForPlayer(playerid,"~r~ROBBERY FAILED~n~~w~YOU DIDN'T KEEP AIMING AT THE CASHIER",3000,3);
}
return 1;
}
mitmacht oder ob es Sinnvoller bzw es reicht nen timer zu nutzen.
Du kannst auch einen Timer machen, der 2-3 mal die Sekunde aufgerufen wird, das geht auch.
OnPlayerUpdate wird halt zum Teil 30 mal die Sekunde aufgerufen, das ist dann doch ziemlich viel für deine Anforderung.
Habe jetzt nen Blinkersystem gefunden, aber irgendwie wird das Objekt ingame nicht erstellt. Was ist falsch ?
new vehicleid = GetPlayerVehicleID(playerid), Float:_vX[2], Float:_vY[2], Float:_vZ[2];
GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZE, _vX[0], _vY[0], _vZ[0]);
Indicators_xqz[vehicleid][0] = CreateObject(19294, 0, 0, 0,0,0,0);
AttachObjectToVehicle(Indicators_xqz[vehicleid][0], vehicleid, _vX[0]/2.23, _vY[0]/2.23, 0.1 ,0,0,0);
Indicators_xqz[vehicleid][1] = CreateObject(19294, 0, 0, 0,0,0,0);
AttachObjectToVehicle(Indicators_xqz[vehicleid][1], vehicleid, _vX[0]/2.23, -_vY[0]/2.23, 0.1 ,0,0,0);
Kurze Frage, habe einen Dialog mit einem String.
Ist es mir irgendwie möglich den Dialog anzeigen zu lassen, ohne den String wieder jedesmal zu formatieren?
Speezy zeig mal deinen Code
So Moin habe folgendes Problem:
stock SpecRandomPlayer(playerid)
{
new i,rplayerid;
new prandomarray[GetPlayerCount()];
while (i < MAX_PLAYERS)
{
if(!IsPlayerConnected(i)) continue;
if(gPlayerTeamSelection[i] != TEAM_SPECTATOR && playerid != i)
prandomarray[i]=i;
i++;
}
randSpectate = random(sizeof(prandomarray));
SpecPlayer(playerid,randSpectate);
}
Alles anzeigen
Ich will dass der Spieler bei dem Diese Funktion aufgerufen wird, einem Spieler zuschaut der 1. nicht er selbst ist. 2. einer der nicht in TEAM_SPECTATOR ist und 3. natuehrlich connected ist. Das wars schon.
Die Spieler ID sollte am besten random ausgesucht werden.
Wie kriege ich das hin? Meine Konstruktion mag der Compiler leider nicht.
Ich sehe jedoch keinen anderen Weg, da ich das Array ja dynamisch erstellen muss, damit ich keinen Nullen drin habe, und da kommts zum Problem wenn ein Spieler die ID 0 hat.
Bitte um Rat
Bitte um Rat
Hier ein kleiner Rat ![]()
stock SpecRandomPlayer(playerid)
{
new randoms[MAX_PLAYERS],idx;
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(IsPlayerConnected(i) && gPlayerTeamSelection[i] != TEAM_SPECTATOR && playerid != i)
{
randoms[idx++]=i;
}
}
if(!idx) return 0; //Hier ist kein anderer Spieler da :)
SpecPlayer(playerid, randoms[random(idx)]);
return 1;
}
Alles anzeigen
Danke dir schonmal, das hat geholfen
Ich wollte es jetzt noch ein bisschen uebertreiben
Wenn der Spieler Linke Pfeiltaste oder Rechtepfeiltaste drueckt, soll bei Links der Spieler den naechsten Spieler mit kleinerer Spieler ID spectaten, als der Aktuell, und bei Rechts der mit der groesseren ID.
Folgendes habe ich dazu bisher
public OnPlayerUpdate(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
if(IsPlayerNPC(playerid)) return 1;
if(IsSpecing[playerid] == 0)
{
HandlePlayerSpectating(playerid);
return 1;
}
// changing teams by inputs
if( !gPlayerHasTeamSelected[playerid] && GetPlayerState(playerid) == PLAYER_STATE_SPECTATING )
{
ClassSel_HandleTeamSelection(playerid);
return 1;
}
return 1;
}
Alles anzeigen
stock HandlePlayerSpectating(playerid)
{
new Keys,ud,lr;
GetPlayerKeys(playerid,Keys,ud,lr);
if(gPlayerTeamSelection[playerid] == -1) {
ClassSel_SwitchToNextTeam(playerid);
return;
}// Der Code ist aus einer Teamauswahl von Grand Larceny um zum ersten Team zu springen, wenn das letzte uebersprungen, kann man das vielleicht auch so fuer Spieler machen, wenn beispielsweise ID 30 der letzte ist, man nach rechts drueckt und dann wieder beim ersten landet?
if( (GetTickCount() - gPlayerLastTeamSelectionTick[playerid]) < delay ) return;
if(lr > 0) {
//Ka was hier rein soll
}
else if(lr < 0) {
//Ka was hier rein soll
}
}
Alles anzeigen
Ich hoffe das ist nicht zuviel fuer kleine Scripting Fragen
Mir viele nur der Weg ein die ID vom aktuellen Spieler zu speichern, und dann alle Spieler durchzugehen, und um zu schauen ob der naechste gueltige Spieler dann eine ID > aktuelle ID hat bzw < und wenn nicht zu continuen;
Das ist mein jetziges Konstrukt von dem ich mir erhoffe dass es irgendwie im Ansatz klappt
HandlePlayerSpectating(playerid)
{
new Keys,ud,lr;
GetPlayerKeys(playerid,Keys,ud,lr);
if( (GetTickCount() - gPlayerLastTeamSelectionTick[playerid]) < delay ) return;
if(lr > 0)
{
new i,targetplayerid;
while(i < MAX_PLAYERS)
{
if(IsPlayerConnected(i) || gPlayerTeamSelection[i] != TEAM_SPECTATOR && spectatorid[playerid] < i)
{
SpecPlayer(playerid,i);
break;
}
else
{
i=0;
while(i < MAX_PLAYERS)
{
if(IsPlayerConnected(i) || gPlayerTeamSelection[i] != TEAM_SPECTATOR && i >= 0)
{
SpecPlayer(playerid,i);
break;
}
i++;
}
i++;
}
}
else if(lr < 0)
{
new i,targetplayerid;
while(i < MAX_PLAYERS)
{
if(IsPlayerConnected(i) || gPlayerTeamSelection[i] != TEAM_SPECTATOR && spectatorid[playerid] > i)
{
SpecPlayer(playerid,i);
break;
}
else
{
i=0;
while(i < MAX_PLAYERS)
{
if(IsPlayerConnected(i) || gPlayerTeamSelection[i] != TEAM_SPECTATOR && i>=0)
{
SpecPlayer(playerid,i);
break;
}
i++;
}
i++;
}
}
}
}
Alles anzeigen
Das ist mein jetziges Konstrukt von dem ich mir erhoffe dass es irgendwie im Ansatz klappt
Machs dir nicht so kompliziert.
Du musst das alles mal ein bisschen modularer schreiben xD
Also mal kurz nebenbei, du musst unter OnPlayerUpdate nicht prüfen ob der Spieler connected ist..weil dieser Callback nur für Spieler aufgerufen wird, die online sind xD
Versuchs mal so:
new SpectatingPlayer[MAX_PLAYERS];
stock getActingPlayer(playerid,&idx)
{
new randoms[MAX_PLAYERS],tmp;
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(IsPlayerConnected(i) && gPlayerTeamSelection[i] != TEAM_SPECTATOR && playerid != i)
{
randoms[tmp++]=i;
}
}
if(!tmp) return INVALID_PLAYER_ID;
if(idx>tmp) idx=0;
if(idx<0) idx=tmp-1;
return randoms[idx];
}
HandlePlayerSpectating(playerid)
{
if( (GetTickCount() - gPlayerLastTeamSelectionTick[playerid]) < delay ) return 1;
new Keys,ud,lr;
GetPlayerKeys(playerid,Keys,ud,lr);
if(lr == KEY_RIGHT)
{
SpectatingPlayer[playerid]++;
ud = getActingPlayer(playerid,SpectatingPlayer[playerid]);
if(ud == INVALID_PLAYER_ID)
{
SpectatingPlayer[playerid]--;
return 1;
}
SpecPlayer(playerid,ud);
}
else if(lr == KEY_LEFT)
{
SpectatingPlayer[playerid]--;
ud = getActingPlayer(playerid,SpectatingPlayer[playerid]);
if(ud == INVALID_PLAYER_ID)
{
SpectatingPlayer[playerid]++;
return 1;
}
SpecPlayer(playerid,ud);
}
return 1;
}
Alles anzeigen
//Edit: Parameter...xD