Nein. Du kannst aber jeden Spieler in eine andere Welt setzen (Bsp. playerid+1000) und für jeden Spieler den NPC nochmals connecten lassen, mit dem Name TutorialBot%d (%d = playerid), das geht. Somit hätte jeder praktisch seinen "eigenen" NPC.
Beiträge von Jeffry
-
-
Lynnchu™: Wenn ja, dann was? Banane(playerid); ?

--------------------------------------------------------------------------------
Zwei Möglichkeiten die mir bekannt sind:- Der NPC connected erst dann, wenn der Spieler die virtuelle Welt betritt.
- Du benutzt sowas wie CNPC/RNPC, also NPCs die man "steuern" kann.
Ich finde die erste Variante ausreichend, die Entscheidung liegt aber bei dir.
-
Der Code kann auf Grund mehrerer Tatsachen so nicht funktionieren. Auch das was oben gepostet wurde ist absoluter Käse, man kann doch nicht nur eine Variable für alle Spieler benutzen, ist doch klar, dass das nicht tut.
Fangen wir mal ganz von vorne an:
1.) Die Variable:
new PlayerText:StatisticBox[MAX_PLAYERS] = {PlayerText:-1, ...}; //Initialisiert das Array (für alle Spieler) mit dem Wert -1.2.) OnPlayerConnect:
StatisticBox[playerid] = CreatePlayerTextDraw(playerid,490.000000, 320.000000, "Level: --"); //Erstellt das Textdraw für den Spieler, GetPlayerScore macht in OnPlayerConnect wenig Sinn, daher der Timer.
PlayerTextDrawShow(playerid,StatisticBox[playerid]);
PlayerTextDrawBackgroundColor(playerid,StatisticBox[playerid], 255);
PlayerTextDrawFont(playerid,StatisticBox[playerid], 3);
PlayerTextDrawLetterSize(playerid,StatisticBox[playerid], 0.600000, 2.000000);
PlayerTextDrawColor(playerid,StatisticBox[playerid], -1);
PlayerTextDrawSetOutline(playerid,StatisticBox[playerid], 1);
PlayerTextDrawSetProportional(playerid,StatisticBox[playerid], 1);
PlayerTextDrawSetSelectable(playerid,StatisticBox[playerid], 0);3.) OnGameModeInit/OnFilterScriptInit (je nach dem):
SetTimer("CheckAllScore", 1000, 1); //Ein Timer zum Updaten der Levels, automatische Änderung des Textdraws wenn sich ein Level ändert.4.) Unten im GM/FS:
forward CheckAllScore(); //Der Aufruf des Timers.
public CheckAllScore()
{
new str[64];
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
format(str,sizeof(str),"Level: %i",GetPlayerScore(i));
PlayerTextDrawSetString(i,StatisticBox[i],str);
}
}
return 1;
}
5.) OnPlayerDisconnect:
//Wenn das Textdraw existiert, lösche es.
if(StatisticBox[playerid] != PlayerText:-1) PlayerTextDrawDestroy(playerid, StatisticBox[playerid]);
StatisticBox[playerid] = PlayerText:-1;Hierbei noch einmal die Bitte: Wenn Ihr keine Ahnung habt, dann postet bitte nicht. Das ist nicht böse gemeint, sondern um eben sowas zu verhindern, dass der Frage-Steller erst recht keinen Durchblick mehr haben wird, weil nur undurchdachter Käse gepostet wird, durchmischt mit Fragen die Off-Topic sind.
Erst Hirn ein, dann Posten. Das macht es uns allen leichter. -
SetTimer("PersoabholenTimer",3000,0);
zu:
SetTimerEx("PersoabholenTimer",3000,0, "d", playerid);SetTimerEx gibt Parameter mit.
-
Du hast zur Zeit vier Textdraws verwendet. Je eins für Fahrzeug, Geschwindigkeit, Schaden und Tank. Du musst, damit die Abstände immer die selben sind, alle Informationen in ein Textdraw packen. Damit sparst du nicht nur 75% der Textdraws sondern hast auch bessere Formatierungsmöglichkeiten.
new str[128];
format(str,sizeof(str), "Fahrzeug: %s Geschwindigkeit: %d Schaden: %d%% Tank: %d%%", Fahrzeugname, speed, health,tank);
TextDrawSetString(td[playerid], str);Verstanden? Probiers aus.
-
Also, da es ja oben anscheinend keiner wirklich richtig erklären kann oder will (warum auch immer trotzdem gepostet, aber gut...), erklär ich dir das mal ganz grob und geb dir die Dinge vor, die du benötigst. Ich kann dir natürlich nicht alles bis hin ins kleinste Detail erklären, bzw. das ganze System erstellen, aber es sollte einigermaßen verständlich sein:
Schritt 1: Initialisierung der Variablen
new PlayerLevel[MAX_PLAYERS];
new PlayerExp[MAX_PLAYERS];Schritt 2: Spieler betritt den Server (OnPlayerConnect)
PlayerLevel[playerid] = 0; //Zu 0 setzen, damit er nicht die Statistiken eines anderen Spielers erhält, wichtig.
PlayerExp[playerid] = 0;
LoadPlayerStatistics(playerid); //Je nach dem wie du deine Spieler-Statistiken lädst.Schritt 3: Statistiken Laden
PlayerLevel[playerid] = dini_Int(Spielerdatei, "Level");
PlayerExp[playerid] = dini_Int(Spilerdatei, "Exp");
//Ich habe hier dini als Beispiel genommen, musst du eben an dein System anpassen
Schritt 4: Statistiken Speichern
dini_IntSet(Spielerdatei, "Level", PlayerLevel[playerid]);
dini_IntSet(Spielerdatei, "Exp", PlayerExp[playerid]);
//Ebenso hierSchritt 5: Funktion zum geben der Experience
stock GivePlayerExp(playerid, exp)
{
PlayerExp[playerid] += exp; //Experience geben
while(PlayerExp[playerid] >= (PlayerLevel[playerid]+1)*1000)
{
PlayerLevel[playerid]++; //Level up
PlayerExp[playerid] -= PlayerLevel[playerid]*1000; //Hier ziehen wir die Punkte wieder ab (Bsp: Exp = 999 Level = 0 => +10 => Exp = 9 Level = 1)
}
return 1;
}Schritt 6: Ausgabe
new str[144];
format(str, sizeof(str), "Du bist im Experience Level %d und hast dort %d Punkte. Du musst noch %d Punkte sammeln um ins nächste Level zu kommen.", PlayerLevel[playerid], PlayerExp[playerid], ((PlayerLevel[playerid]+1)*1000)-PlayerExp[playerid]);
SendClientMessage(playerid, 0xFF0000FF, str);Anmerkung:
Die Levels sind so aufgebaut:
Level 0 => 1: 1000 Punkte (ges. 1000)
Level 1 => 2: 2000 Punkte (ges. 3000)
Level 2 => 3: 3000 Punkte (ges. 6000)
(usw.)So, das wars. Ich denke das ist anschaulich genug, damit solltest du eine Menge anfangen können.
Natürlich musst/kannst du das ganze abändern, je nach dem wie du es wünschst. Das ist aber das grobe Gerüst auf das du aufbauen kannst. Nennen wir es das Skelett. -
Oh Kinders, immer diese Diskussionen anstatt mal auf den Punkt zu kommen.
string wird einfach wieder in string geschrieben. Einfacher gehts nicht.
new string[2048];
format(string,sizeof(string),"_____________________________________|Statistiken|_____________________________________");
format(string, sizeof(string),"%s\n*Statistiken von %s*",string,name);
format(string, sizeof(string), "%s\nLevel:[%d] Geschlecht:[%s] Alter:[%d] Geld:[$%d] Bank:[$%d] Handy:[%d]",string, level,atext,age, cash, account, pnumber);
format(string, sizeof(string), "%s\nPremiumRang:[%s] Herkunft:[%s] Verheiratet:[%s] Spielzeit:[%d] Job:[%s]",string, drank,otext,married,ptime,jtext);
format(string, sizeof(string), "%s\nFishesCaught:[%d] GrößterFisch:[%d] Verbrechen:[%d] Gefängniszeit:[%d] Gesucht:[%d]",string, fishes,bigfish,crimes,arrests,warrests );
format(string, sizeof(string), "%s\nKills:[%d] Tode:[%d] Respekt:[%d/%d] WantedLevel:[%d] Spawnhealth:[%.1f] LottoNr:[%d]",string,kills,deaths,exp,expamount,wanted,shealth+50,lotto);
format(string, sizeof(string), "%s\nDrogen:[%d] Materials:[%d] Team:[%s] Krankheit:[%s] Organisation:[%s] Rank:[%s]",string,drugs,mats,ttext,dtext,ftext,rtext);
format(string, sizeof(string), "%s\nNachLoginMin: [%d] Spielminuten: [%d]",string,PlayerInfo[targetid][pMinutesSinceLogin],PlayerInfo[targetid][pGesamtMinutes]);
format(string, sizeof(string),"%s\nHausschlüssel[%d] Bizzkey[%d] Leihschlüssel[%d] Int[%d] Local[%d]",string, housekey,bizkey,HireCar[targetid],intir,local);
format(string, sizeof(string),"%s\nHealth [%.2f] Schutzweste [%.2f] IP[%s] Ping [%d] Warnungen[%d]",string,plHealth,plArmour,plIP,GetPlayerPing(targetid),PlayerInfo[targetid][pWarns]);
ShowPlayerDialog(playerid, DIALOG_STATS,DIALOG_STYLE_MSGBOX,"DSR User Stats",string,"Auswählen","Abbrechen");Nein, du musst nichts aufsplitten.
Ja, man kann den string größer als 500 machen.
Nein, strcat ist nicht übersichtlicher, wenn dann ist das relativ und liegt im Auge des Betrachters. -
Schreib in die dutils.inc oben noch dazu:
#include <a_samp>
#include <file>Dann nochmal kompilieren.
-
Nimm OnPlayerGiveDamage anstatt OnPlayerTakeDamage. Dann sollte es funktionieren.
EDIT: Schade, es wird aufgerufen wenn Spieler das gleiche Team haben.
-
Doch kannst du Musst ihn aber mit ` eingrenzen
Danke, das war mir nicht bekannt. Gut zu wissen.Alles anzeigen
Außerdem seitwann werden %d (Double Werte) im String gespeichert?
Gemeint ist hier das
`fRank`='%d',
Es müsste
fRank = %i
%d steht auch für Intergers, das kann man bedenkenlos verwenden.Der Fehler in der ersten Zeile liegt hier:
´Fraktion´='0',
zu:
`Fraktion`='0',
Die Haken waren falschrum. -
Im Query ändern:
LasPosX zu: LastPosXIn Query & Datenbank ändern:
Alter zu: AgeWarum nicht Alter? Alter ist ein MySQL Befehl, den kannst du nicht für eine Spalte benutzen.EDIT: Danke, wusste ich nicht.
-
Das geht nur mit neuen Zeilen:
Men = CreatePlayerTextDraw(playerid,300,300,"~y~Einstellungen~n~~n~~n~~n~~n~~n~~n~"); -
Den Query erhöhen
new query[1024],
format(query, 1024, ...und:
`fRank`=`%d`,
zu:
`fRank`='%d',Sowie:
`JailTime`=`%d`,
zu:
`JailTime`='%d', -
RegDatum wird als Array im enum initialisiert:
RegDatum[24],Geladen wird es dann so:
format(User[playerid][RegDatum], 24, "%s", dini_Get(Spielerdatei, "Datum"));Ausgegeben:
format(msg, sizeof(msg), "Registriert am: %s", User[playerid][RegDatum]); -
new year,month,d, tmp[24]; //Variablen deklarieren
getdate(year, month, d); //getdate gibt das Datum zurück
format(tmp, sizeof(tmp), "%02d.%02d.%d", d, month, year); //Formatierung
dini_Set(Spielerdatei, "Datum", tmp); //Speicherungnew,h,m,s; //Variablen deklarieren
gettime(h,m,s); //gettime gibt die Uhrzeit zurück
format(tmp, sizeof(tmp), "%02d:%02d:%02d", h, m, s); //Formatierung
dini_Set(Spielerdatei, "Zeit", tmp); //Speicherung -
#include <a_samp>
#define MAX_FLUGHAEFEN 5
#define DODO_ID 593
#define NEVADA_ID 553
#define SHAMAL_ID 519
#define BEAGLE_ID 511new Dodo[MAX_FLUGHAEFEN];
new Shamal[MAX_FLUGHAEFEN];
new Nevada[MAX_FLUGHAEFEN];
new Beagle[MAX_FLUGHAEFEN];new Flughafen[MAX_PLAYERS] = {-1,...};
new FlughafenNr[MAX_PLAYERS];
new FlughafenName[MAX_FLUGHAEFEN][25];
new Strecke[MAX_PLAYERS];enum Check
{
Float:x,
Float:y,
Float:z,
Float:size
};
//Die Flughäfen
new Float:Checkpoints[5][Check] = {
{1576.9788,1391.3984,10.8483, 10.0},//lva,0
{-1364.0537,-215.1572,14.1484, 10.0},//sfa,1
{-760.1149,1994.4023,5.4734,10.0},//sherman,2
{1726.6909,-2407.4905,13.5547,10.0},//ls,3
{2866.5273,1870.2122,14.1785,10.0}//rockshore,4};
public OnFilterScriptInit()
{
Dodo[0]=1;
Dodo[1]=1;
Dodo[2]=1;
Dodo[3]=1;
Dodo[4]=1;
Shamal[0] = 1;
Shamal[1] = 1;
Shamal[2] = 1;
Shamal[3] = 1;
Shamal[4] = 1;
Nevada[0] = 1;
Nevada[1] = 1;
Nevada[2] = 1;
Nevada[3] = 1;
Beagle[0]=1;
Beagle[1]=1;
Beagle[2]=1;
Beagle[3]=1;
Beagle[4]=1;
FlughafenName[0] = "Name0";
FlughafenName[1] = "Name1";
FlughafenName[2] = "Name2";
FlughafenName[3] = "Name3";
FlughafenName[4] = "Name4";
return 1;
}public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/work", true))
{
new vehid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehid) != DODO_ID && GetVehicleModel(vehid) != NEVADA_ID && GetVehicleModel(vehid) != SHAMAL_ID && GetVehicleModel(vehid) != BEAGLE_ID) return SendClientMessage(playerid, 0xFF0000FF, "Error: Kein Flugzeug.");
new id = GetNearestAirport(playerid);
if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: No Airports found (If you get this error use /admin to report this bug to an admin!).");
Flughafen[playerid] = id;
FlughafenNr[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SetPlayerCheckpoint(playerid,Checkpoints[id][x],Checkpoints[id][y],Checkpoints[id][z],Checkpoints[id][size]);
new str[144];
format(str, sizeof(str), "Info: Flughafen %s (ID: %d) wird angezeigt. Erlaubte Flugzeuge:", FlughafenName[id], id);
SendClientMessage(playerid, 0x00FFFFFF, str);
if(Dodo[id] == 1) format(str, sizeof(str), "Dodo", str);
if(Shamal[id] == 1) format(str, sizeof(str), "%s, Shamal", str);
if(Nevada[id] == 1) format(str, sizeof(str), "%s, Nevada", str);
if(Beagle[id] == 1) format(str, sizeof(str), "%s, Beagle", str);
return SendClientMessage(playerid, 0x00FFFFFF, str);
}
return 0;
}public OnPlayerEnterCheckpoint(playerid)
{
FlughafenNr[playerid]++;
if(FlughafenNr[playerid] == 1)
{
//kein Geld, dafür:
//Neuer Flughafen ...
new vehid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehid) != DODO_ID && GetVehicleModel(vehid) != NEVADA_ID && GetVehicleModel(vehid) != SHAMAL_ID && GetVehicleModel(vehid) != BEAGLE_ID) return SendClientMessage(playerid, 0xFF0000FF, "Error: Kein Flugzeug.");
new id = GetRandomAirport(playerid);
if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Kein Flughafen gefunden.");
Flughafen[playerid] = id;
DisablePlayerCheckpoint(playerid);
SetPlayerCheckpoint(playerid,Checkpoints[id][x],Checkpoints[id][y],Checkpoints[id][z],Checkpoints[id][size]);
Strecke[playerid] = floatround(GetPlayerDistanceFromPoint(playerid, Checkpoints[id][x],Checkpoints[id][y],Checkpoints[id][z]));
new str[144];
format(str, sizeof(str), "Info: Flughafen %s (ID: %d) wird angezeigt. Erlaubte Flugzeuge:", FlughafenName[id], id);
SendClientMessage(playerid, 0x00FFFFFF, str);
if(Dodo[id] == 1) format(str, sizeof(str), "Dodo", str);
if(Shamal[id] == 1) format(str, sizeof(str), "%s, Shamal", str);
if(Nevada[id] == 1) format(str, sizeof(str), "%s, Nevada", str);
if(Beagle[id] == 1) format(str, sizeof(str), "%s, Beagle", str);
return SendClientMessage(playerid, 0x00FFFFFF, str);
}
else
{
//Geld...und kein neuer Flughafen mehr:
FlughafenNr[playerid]=0;
Flughafen[playerid]=-1;GivePlayerMoney(playerid,((Strecke[playerid]/1000)*1500)+25000);
}
return 1;
}stock GetNearestAirport(playerid)
{
new Float:d = 2000000000.0, id = -1, veh = GetVehicleModel(GetPlayerVehicleID(playerid));
for(new i=0; i<MAX_FLUGHAEFEN; i++)
{
if(i == Flughafen[playerid]) continue;
new Float:tmp = GetPlayerDistanceFromPoint(playerid, Checkpoints[i][x],Checkpoints[i][y],Checkpoints[i][z]);
if(tmp < d)
{
if(veh == DODO_ID && Dodo[i] == 1 ||
veh == SHAMAL_ID && Shamal[i] == 1 ||
veh == BEAGLE_ID && Beagle[i] == 1 ||
veh == NEVADA_ID && Nevada[i] == 1) d = tmp, id = i;
}
}
return id;
}stock GetRandomAirport(playerid)
{
new id = -1, veh = GetVehicleModel(GetPlayerVehicleID(playerid)), count;
for(new i=0; i<MAX_FLUGHAEFEN; i++)
{
if(veh == DODO_ID && Dodo[i] == 1 ||
veh == SHAMAL_ID && Shamal[i] == 1 ||
veh == BEAGLE_ID && Beagle[i] == 1 ||
veh == NEVADA_ID && Nevada[i] == 1) count++;
}
count = random(count)+1;
for(new i=0; i<MAX_FLUGHAEFEN; i++)
{
if(veh == DODO_ID && Dodo[i] == 1 ||
veh == SHAMAL_ID && Shamal[i] == 1 ||
veh == BEAGLE_ID && Beagle[i] == 1 ||
veh == NEVADA_ID && Nevada[i] == 1)
{
count--;
if(count == 0) id = i;
}
}
return id;
}Hier bitte. Hat 5 Minuten gedauert das zu ändern.
Sollte funktionieren. -
-
TogglePlayerControllable(playerid, false);
SetTimerEx("Unfreeze", 10000,0,"d",playerid);forward Unfreeze(playerid);
public Unfreeze(playerid) return TogglePlayerControllable(playerid);Sollte soweit selbsterklärend sein.
-
Nein das geht nicht. Die Sichtweite ist vom Spiel her begrenzt. Wenn du die erhöhen willst brauchst du einen Mod.
Es gibt allerdings die Möglichkeit das Wetter zu einer bestimmten ID zu ändern, dann sieht man alle Objekte viel weiter, dafür ist alles mehr oder weniger Pink. -
Genau wie du es geschrieben hast. Stehen, aufnehmen, fertig.