Ehh...hast du denn sowas wie eine SaveHaus Funktion unter OnGameModeExit?
Die würde uns weiterbringen ![]()
#Handy
Ehh...hast du denn sowas wie eine SaveHaus Funktion unter OnGameModeExit?
Die würde uns weiterbringen ![]()
#Handy
Für alle die interessiert was da steht, aber zu faul sind, das irgendwie abzutippen oder zu decoden, steht im Spoiler.
Manniac, wenn dus bist, bitte nicht öffnen, du sollst knobeln, ist nur für alle anderen gedacht hahahaha ![]()
Manniac, ich meins ernst ![]()
Anzeige ist raus an dich xD
exterminate
(Für die Leute, die kein Englisch können: "vernichten")
Inzwischen ist es üblich für sowas sscanf zu verwenden:
new produkt,menge;
if(sscanf(params,"dd",produkt,menge))
Such einfach mal nach sscanf tutorial samp, da solltest du fündig werden ![]()
Wenn ich ganz ehrlich bin, gehe ich nicht davon aus, dass jemand das komplette Rätsel alleine lösen kann
Du meinst damit der Reddit Thread ist nicht das Ende?
Dann hab ich doch gezeigt wie das gemacht werden kann ![]()
ob es richtig ist
...das ist mit einer Cäsar Verschlüsselung noch versehen...
//Edit: Mal entfernt, sonst hab ich zuviel verraten
//Edit:
Ihr könnt natürlich gerne in diesem Thread über Lösungsansätze etc diskutieren.
Das macht nicht soviel Sinn oder? ![]()
Aufgrund folgender Punkte:
Wenn du damit z.B. meinst:
enum test
{
a,
b,
c
};
new Info[test];
//Um jetzt nachzufragen was c für einen Wert hat:
printf("%d", Info[test:2]);
//Sieht dein enum jetzt so aus:
enum test
{
a,
b,
d,
c
};
//Würdest du mit selbem Code jetzt den Wert von d bekommen
Alles anzeigen
Also falls du das meinst ![]()
Wenn nicht, musst du dich klarer artikulieren ![]()
Es hilft auch manchmal mit Pseudo-Code zur Darstellung zu arbeiten ![]()
Ich weiß noch nicht, auf was hättest du den mal wieder lust?
Ist schwer zu sagen. Aber ich kann ja mal meine Gedanken äußern:
Die meisten versuchen wie eh und je, entweder ein Reallife/Roleplay Projekt zu machen, aber in meinen Augen ist das mehr als ausgelutscht. Das zeigt sich auch anhand der Spielerzahlen dann auf den Servern. Die einzigen wo Leute noch spielen, sind entweder GFs, weil es einfach bisschen nostalgisch ist oder noch mehr bei GF + Statsback. Einfach damit man auf dem Stand vom letzten Server ist.
Das ist schön und gut, dass es solche Server gibt, aber in meinen Augen ist es deshalb ein wenig unnötig das wieder und wieder zu probieren, einfach weil es soviele schon probiert haben und es immer wieder gescheitert ist, zum Teil auch, weil der Aufwand so groß ist und durch wenige Spieler, können solche Konzepte dann nicht halten. Oder das Team springt ab, man kennt ja die üblichen Probleme, vom Geld mal ganz abgesehen.
Zumal von solchen Servern erwartet wird, dass man extrem LANGE spielt, was ich dämlich finde. Also die selbe Trucker Route nun zum 30.000x zu fahren, damit man bisschen Kohle bekommt, für ein Haus, was einem nix bringt...gg
Das macht ja auch nicht wirklich Spaß.
Also ich fände es cool, wenn es auf einem Server mal nur um Spaß und Freizeitgestaltung geht...und damit meine ich kein dummes DM oder irgendwelche komischen Derby/Race Geschichten.
Sondern mal etwas innovatives, was Geschicklichkeit erfordert, bin ein riesen Fan von so Missions, deshalb hatte ich ja auch mal einen Mission Server geschrieben xD
*Hust*
Der kam eig ganz gut bei den Leuten an, aber da habe ich gemerkt, dass nicht wirklich viele Leute, meine Leidenschaft dafür teilen ![]()
Also...da waren immer mal nur so paar Leute drauf und wirklich den Multiplayer Mode haben glaube auch nur so 10 Leute gemacht ![]()
Fand ich bisschen Schwach xD
Aber was soll man machen xD
Bin aber ein riesen Fan von Missions + Games wie Basketball, Minigolf, Volleyball, Billard, Fußball xD
Aber generell, weiß ich nicht geht meine Empfehlung dahin, es eigentlich sein zu lassen hahaha xD
Wahrscheinlich heißt irgendwas schon so, aber die Lösung ist eigentlich doof, da das sehr aufwändig ist.
Wir machen das mal anders, behalte mal deinen alten Code und ändere einfach mal im Include die dini_Get Funktion so ab:
stock dini_Get(filename[],key[]) {
new tmpres[DINI_MAX_STRING];
new key_length = strlen(key);
if (key_length==0 || key_length+2>DINI_MAX_STRING) return tmpres;
new File:fohnd;
fohnd=fopen(filename,io_read);
if (!fohnd) return tmpres;
while (fread(fohnd,tmpres)) {
if (
tmpres[key_length]=='='
&& !strcmp(tmpres, key, true, key_length)
) {
/* We've got what we need */
DINI_StripNewLine(tmpres);
strmid(tmpres, tmpres, key_length + 1, strlen(tmpres), DINI_MAX_STRING);
fclose(fohnd);
if(tmpres[0] == EOS) tmpres = "/";
return tmpres;
}
}
fclose(fohnd);
if(tmpres[0] == EOS) tmpres = "/";
return tmpres;
}
Alles anzeigen
für ein Projekt
Was für ein Mode denn? ![]()
Ja, das ist doch richtig...mein Code funktioniert doch..
Jetzt sollte dir der Dialog angezeigt werden.
Der Grund wieso dir der Name nicht angezeigt wird, liegt an deinem File.
In dini schreibt man z.B. CharacterName1=Arnold, also du musst das mit einem = separieren, nicht mit einem Leerzeichen...
Du Scherzkeks, wieso verwendest du den Code, wenn ich dir doch schon in meiner 1. Antwort erklärt habe, wieso da nichts angezeigt wird?!
Wieso verwendest du dann weiter deinen Code und wunderst dich, wieso es weiterhin nicht geht?
Nimm doch meinen Code?!
<null>
Bei allen drei.
....Ja, wie sieht dein Code aus?
Und bist du sicher, dass der Pfad zu deiner Datei stimmt?
String ist einfach leer.
Dann prüfe mal die anderen Strings, aus denen sich der Hauptstring zusammensetzt.
Zeig am besten mal deinen aktuellen Code und das was du uns da geschickt hast ist nicht der server_log ![]()
Dann lade mal crashdetect vielleicht gibt dir das was im server log aus.
Ansonsten verwende mal ein print und schau, was im string steht ![]()
Wenn der String von dem ersten Charakter leer ist, wird das sogenannte NULL-Byte zurückgegeben.
Sobald im String das NULL-Byte steht, wird jede lese Operation darauf abgebrochen.
Beispiel kann dein string sein "\0Hallo" dann würdest du nicht Hallo lesen können, da beim NULL Byte schon abgebrochen wird.
Folglich musst du prüfen ob das im String vorhanden ist ![]()
new ch[3][MAX_PLAYER_NAME];
format(Info[playerid][CharacterName1],MAX_PLAYER_NAME,dini_Get(file, "CharacterName1"));
format(Info[playerid][CharacterName2],MAX_PLAYER_NAME,dini_Get(file, "CharacterName2"));
format(Info[playerid][CharacterName3],MAX_PLAYER_NAME,dini_Get(file, "CharacterName3"));
if(Info[playerid][CharacterName1][0] == EOS) ch[0] = "/";
else strcat(ch[0],Info[playerid][CharacterName1]);
if(Info[playerid][CharacterName2][0] == EOS) ch[1] = "/";
else strcat(ch[1],Info[playerid][CharacterName2]);
if(Info[playerid][CharacterName3][0] == EOS) ch[2] = "/";
else strcat(ch[2],Info[playerid][CharacterName3]);
format(string,sizeof(string),"%s\n%s\n%s",ch[0],ch[1],ch[2]);
ShowPlayerDialog(playerid,DIALOG_LOGIN_2,DIALOG_STYLE_LIST,"Charaktere:",string,"Login","Abbrechen");
Alles anzeigen
aber dachte man kann den chat closen.
Ja theoretisch ginge das, wenn du ein einfaches Include erstellst.
Hier habe das mal für dich gemacht:
/* SA-MP Include Chat Control System
*
* (c) by Kaliber, 2018
*
*/
// native ClearChat(playerid);
// native HideChatForPlayer(playerid);
// native ShowChatForPlayer(playerid);
native chat__SendClientMessage(playerid,color,const string[]) = SendClientMessage;
native chat__SendClientMessageToAll(color,const string[]) = SendClientMessageToAll;
stock ClearChat(playerid)
{
for(new i; i<30; i++) chat__SendClientMessage(playerid,-1," ");
return 1;
}
stock HideChatForPlayer(playerid)
{
SetPVarInt(playerid,"_hide_chat",true);
return 1;
}
stock ShowChatForPlayer(playerid)
{
DeletePVar(playerid,"_hide_chat");
return 1;
}
stock chat_SendClientMessage(playerid,color,const string[])
{
return (!GetPVarType(playerid,"_hide_chat")) ? chat__SendClientMessage(playerid,color,string) : 1;
}
#if defined _ALS_SendClientMessage
#undef SendClientMessage
#else
#define _ALS_SendClientMessage
#endif
#define SendClientMessage chat_SendClientMessage
stock chat_SendClientMessageToAll(color,const string[])
{
chat__SendClientMessageToAll(color,string);
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i) && GetPVarType(i,"_hide_chat")) ClearChat(i);
}
return 1;
}
#if defined _ALS_SendClientMessageToAll
#undef SendClientMessageToAll
#else
#define _ALS_SendClientMessageToAll
#endif
#define SendClientMessageToAll chat_SendClientMessageToAll
Alles anzeigen
Funktionieren tut das ganz einfach in deinem Fall:
//Wenn er in den TV-Mode geht:
ClearChat(playerid); //cleart den chat
HideChatForPlayer(playerid); //sorgt dafür, dass keine weiteren Nachrichten mehr an den Spieler gesendet werden können
//Wenn er wieder raus geht:
ShowChatForPlayer(playerid); //jetzt können wieder Nachrichten an den Spieler gesendet werden
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Allerdings würde er Informationen verlieren, falls er angeschrieben worden wäre in dieser Zeit.
Dafür hatte ich mal das hier entwickelt: Nachrichten Cache
Wenn du die Nachrichten zusätzlich dem Spieler erhalten magst, kannst du das integrieren.
Also du musst das nachrichten-cache Include inkludieren und dann, das nachrichten-control Include so abändern:
/* SA-MP Include Chat Control System + Nachrichten Cache
*
* (c) by Kaliber, 2018
*
*/
// native ClearChat(playerid);
// native HideChatForPlayer(playerid);
// native ShowChatForPlayer(playerid);
native chat__SendClientMessage(playerid,color,const string[]) = SendClientMessage;
native chat__SendClientMessageToAll(color,const string[]) = SendClientMessageToAll;
stock ClearChat(playerid)
{
for(new i; i<30; i++) chat__SendClientMessage(playerid,-1," ");
return 1;
}
stock HideChatForPlayer(playerid)
{
SetPVarInt(playerid,"_hide_chat",true);
return 1;
}
stock ShowChatForPlayer(playerid)
{
DeletePVar(playerid,"_hide_chat");
return 1;
}
stock chat_SendClientMessage(playerid,color,const string[])
{
if(isCache(playerid)) appendCache(playerid,color,string);
return (!GetPVarType(playerid,"_hide_chat")) ? chat__SendClientMessage(playerid,color,string) : 1;
}
#if defined _ALS_SendClientMessage
#undef SendClientMessage
#else
#define _ALS_SendClientMessage
#endif
#define SendClientMessage chat_SendClientMessage
stock chat_SendClientMessageToAll(color,const string[])
{
chat__SendClientMessageToAll(color,string);
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i) && GetPVarType(i,"_hide_chat"))
{
if(isCache(i)) appendCache(i,color,string);
ClearChat(i);
}
}
return 1;
}
#if defined _ALS_SendClientMessageToAll
#undef SendClientMessageToAll
#else
#define _ALS_SendClientMessageToAll
#endif
#define SendClientMessageToAll chat_SendClientMessageToAll
Alles anzeigen
Nutzen tust du das dann einfach so:
//Füge unter OnPlayerConnect folgendes ein:
initCache(playerid);
//Wenn er in den TV-Mode geht:
ClearChat(playerid); //Löscht den Chat
startCache(playerid); //Startet die Nachrichten-Aufzeichnung
HideChatForPlayer(playerid); //Sendet keine Nachrichten mehr an den Spieler
//Wenn er aus dem TV-Mode geht:
ShowChatForPlayer(playerid); //Jetzt können wieder Nachrichten an den Spieler gesendet werden
endCache(playerid); //Sendet alle Nachrichten, die der Spieler verpasst hat, an ihn :)
Alles anzeigen
Hahaha, nur für den Fall der Fälle hahaha ![]()
HideChatForPlayer oder wie?
Eine native Funktion gibt es leider dafür nicht, aber sowas könnte man skripten.
for(new i; i<50; i++) SendClientMessage(playerid,-1," ");
Das Beispielsweise cleart den chat für den Spieler.
Anschließend müsstest du dafür sorgen, dass der Spieler keine Nachrichten mehr bekommt über OnPlayerText. Ja ist etwas aufwändiger, aber ansonsten gibt es da keine Möglichkeit oder du sagst ihm er soll 2x F7 drücken hahaha ![]()
Hab es versucht mit Textdraw Filterscript zu erstellen aber ich habe eine ganz alte Version und das hat nicht ganz geklappt.
Das ist eine ziemlich schlechte & faule Ausrede...schließlich könntest du einfach eine neue Version downloaden und es nochmal probieren ![]()
Mit ein paar einfachen Kniffen ist dann z.B. sowas möglich:

Hier wenn du den Code willst:
Bist du sicher, dass du den Code willst?
Willst du es nicht lieber noch einmal selbst probieren?
Rly?
stock SetPlayerTVMode(playerid) //Zeigt den Mode
{
new const Float:data[][] = {
{-0.500, -0.500, 314.500, 239.500},
{640.000, -0.500, -326.000, 235.000},
{-0.500, 448.000, 329.500, -236.000},
{640.000, 448.000, -314.000, -228.500}
};
new PlayerText:tv[6];
tv[0] = CreatePlayerTextDraw(playerid,0.000000, 0.000000, "_");
PlayerTextDrawLetterSize(playerid,tv[0], 0.500000, 50.000000);
PlayerTextDrawColor(playerid,tv[0], -1);
PlayerTextDrawSetOutline(playerid,tv[0], 0);
PlayerTextDrawSetProportional(playerid,tv[0], 1);
PlayerTextDrawSetShadow(playerid,tv[0], 1);
PlayerTextDrawUseBox(playerid,tv[0], 1);
PlayerTextDrawBoxColor(playerid,tv[0], 0x00000044); //->Macht den tv screen dunkler, wenn du z.B. 0x00000022 machst, wird es heller
PlayerTextDrawTextSize(playerid,tv[0], 640.000000, 0.000000);
tv[1] = CreatePlayerTextDraw(playerid,566.000000, 39.000000, "REC\124;");
PlayerTextDrawLetterSize(playerid,tv[1], 0.200000, 1.000000);
PlayerTextDrawColor(playerid,tv[1], -1);
PlayerTextDrawSetOutline(playerid,tv[1], 1);
PlayerTextDrawSetProportional(playerid,tv[1], 1);
for (new i; i<sizeof(data); i++) {
tv[i+2] = CreatePlayerTextDraw(playerid,data[i][0], data[i][1], "ld_grav:tvcorn");
PlayerTextDrawFont(playerid,tv[i+2], 4),PlayerTextDrawColor(playerid,tv[i+2], -1);
PlayerTextDrawTextSize(playerid,tv[i+2], data[i][2], data[i][3]);
}
for(new i,str[16]; i<sizeof(tv); i++) {
PlayerTextDrawShow(playerid,tv[i]);
format(str,sizeof(str),"tv_mode_%d",i);
SetPVarInt(playerid,str,_:tv[i]);
}
return 1;
}
stock HidePlayerTVMode(playerid) //Versteckt den Mode
{
for(new i,PlayerText:id,str[16]; i<6; i++) {
format(str,sizeof(str),"tv_mode_%d",i);
if(!GetPVarType(playerid,str)) return 0;
id = PlayerText:GetPVarInt(playerid,str);
PlayerTextDrawHide(playerid,id);
PlayerTextDrawDestroy(playerid,id);
DeletePVar(playerid,str);
}
return 1;
}
Alles anzeigen