Soll es auch an Random Orten spawnen? Wenn ja kann ich helfen
Beiträge von Sub Royal
-
-
Ne Funktion um formatierte Nachrichten direkt mit SendClientMessageEx ausgeben zu koennen statt immer format zu nutzen
C
Alles anzeigen#define BYTECOUNT (cellbits / 8) stock SendClientMessageEx(playerid, color, fstring[], {Float, _}:...) { static const ARGC = 3; new n = (numargs() - ARGC) * BYTECOUNT; if (n) { new message[128], arg_start, arg_end; #emit CONST.alt fstring #emit LCTRL 5 #emit ADD #emit STOR.S.pri arg_start #emit LOAD.S.alt n #emit ADD #emit STOR.S.pri arg_end do { #emit LOAD.I #emit PUSH.pri arg_end -= BYTECOUNT; #emit LOAD.S.pri arg_end } while (arg_end > arg_start); #emit PUSH.S fstring #emit PUSH.C 128 #emit PUSH.ADR message n += BYTECOUNT * 3; #emit PUSH.S n #emit SYSREQ.C format n += BYTECOUNT; #emit LCTRL 4 #emit LOAD.S.alt n #emit ADD #emit SCTRL 4 return SendClientMessage(playerid, color, message); } else { return SendClientMessage(playerid, color, fstring); } } -
ist definiert wie folgt:
#define FIRST_TEAM_LOCATION "Mount Chilliad (South)"
Wobei ich auch mal einfach #define FIRST_TEAM_LOCATION Mount Chilliad (South) probiert habe, aber das war auch nicht von Erfolg gekroent.
Ersteres mit den Anfuehrungszeichen habe ich bei der format Variante probiert, um das dann als %s einzubauen
-
@SaschaLouis: Das macht der Compiler leider nicht mit

-
Habe ein Problem mit den Makros
Folgende Varianten habe ich probiert:
CTextdraw00 = TextDrawCreate(10.000000,379.000000,"Location: FIRST_TEAM_LOCATION"); ClassSel_InitTeamNameText(Textdraw00); Textdraw01 = TextDrawCreate(10.000000,379.000000,"Location: SECOND_TEAM_LOCATION"); ClassSel_InitTeamNameText(Textdraw01); Textdraw02 = TextDrawCreate(10.000000,379.000000,"Location: THIRD_TEAM_LOCATION"); ClassSel_InitTeamNameText(Textdraw02);
Das hat leider nicht geklapptDann mal folgende Variante
C
Alles anzeigennew Textdraw00Update[32]; format(Textdraw00Update,sizeof(Textdraw00Update),"Location: %s",FIRST_TEAM_LOCATION); Textdraw00 = TextDrawCreate(10.000000,379.000000,Textdraw00Update); ClassSel_InitTeamNameText(Textdraw00); new Textdraw01Update[32]; format(Textdraw01Update,sizeof(Textdraw01Update),"Location: %s",SECOND_TEAM_LOCATION); Textdraw00 = TextDrawCreate(10.000000,379.000000,Textdraw01Update); ClassSel_InitTeamNameText(Textdraw01); new Textdraw02Update[32]; format(Textdraw02Update,sizeof(Textdraw02Update),"Location: %s",THIRD_TEAM_LOCATION); Textdraw00 = TextDrawCreate(10.000000,379.000000,Textdraw02Update); ClassSel_InitTeamNameText(Textdraw02);Im ersten Fall wurde statt dem Namen den ich als z.B. FIRST_TEAM_LOCATION definiert habe, einfach nur FIRST_TEAM_LOCATION angezeigt.
Im 2. Fall mit format wurde garnichts angzeigt und die Textdraws haben rumgebuggt -
Alles klarHabe mal ne kleine Frage
Was ist eigentlich der return Wert von sscanf bzw. was returnt sscanf?Werde mir bald mal ocmd anschauen, bis dahin experementiere ich noch bisschen
bin von strcmp jetzt mal dazu gekommen um zu sehen wie schnell das ist
C
Alles anzeigenif(!sscanf(cmdtext[strlen("/freeze")+1], "u", target)) { if(IsPlayerAdmin(playerid)) { if(!IsPlayerConnected(target)) return SendClientMessage(playerid, COLOR_WHITE, "SERVER: Player not connected"); TogglePlayerControllable(target,false); } } else { return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /freeze [playerid]"); }Gehen weiterhin irgendwie structs in PAWN?
Habe nun rausgefunden dass die Methode mit sscanf statt strcmp nun nochmal um einiges schneller ist
Bench for strcmp: executes, by average, 678.47 times/ms.
Bench for sscanf: executes, by average, 2612.83 times/ms.Gibt es einen einigermassen praktikablen Weg z.B. zcmd mit meiner Variante zu vergleichen?
-
ist es eigentlich schneller einen command in einem Array zu suchen? Ersetze gerade strcmp durch Nen Array mit den Befehlen und sscanf
-
Jeffry:
Habe ich mal gemacht
Jetzt kommt folgendes rausBench for sscanf: executes, by average, 6338.17 times/ms.
Bench for strtok: executes, by average, 878.08 times/ms.
Bench for strtok2: executes, by average, 2893.69 times/ms. -
Moin ne Frage
Kann ich den Teil hier alternativ mit sscanf ausdruecken?
edit:Habs geschafft mit
Endlich kann ich strtok wegschmeissen

/edit:
Warum soll strtok eigentlich so schlecht sein?
Habe gerade mal strtok (Das von DracoBlue), strtok(Das von Jeffry was schneller sein sollte) mit sscanf verglichen, und es kam raus dass das angebliche schnellere strtok von Jeffry langsamer war als strtok von Dracoblue und sscanf. Strtok von DracoBlue war jedoch nur extrem minimal von sscanf entfernt warum auch immerC
Alles anzeigen#include <a_samp> #include <sscanf2> #pragma tabsize 0 #define START_BENCH(%0); {new __a=%0,__b=0,__c,__d=GetTickCount(),__e=1;do{}\ while(__d==GetTickCount());__c=GetTickCount();__d=__c;while(__c-__d<__a||\ __e){if(__e){if(__c-__d>=__a){__e=0;__c=GetTickCount();do{}while(__c==\ GetTickCount());__c=GetTickCount();__d=__c;__b=0;}}{ #define FINISH_BENCH(%0); }__b++;__c=GetTickCount();}printf(" Bench for "\ %0": executes, by average, %.2f times/ms.",floatdiv(__b,__a));} new cmdtext[32]; strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; } new offset = index; new result[20]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; } stock strtok2(const string[], &index) { new result[20], length = strlen(string), i = index; while ((i < length) && (string[i] == ' ')) i++; strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20); index++; return result; } main() { new cmd[32], idx; format(cmdtext,sizeof(cmdtext),"/dropmoney 10000"); START_BENCH( 1000 ); sscanf(cmdtext,"s[32]d",cmd,idx); FINISH_BENCH( "sscanf" ); START_BENCH( 1000 ); cmd = strtok(cmdtext, idx); FINISH_BENCH( "strtok" ); START_BENCH( 1000 ); cmd = strtok2(cmdtext, idx); FINISH_BENCH( "strtok2" ); }Das Ergebnis war verblueffend
-
Kaliber: Das werde ich mal probieren die Teile zu erstellen wenn die im Streambereich sind.
Naja ich habe gedacht ich returne mal irgendwas damit es nicht so langweilig ist, aber ich sehe jetzt erst dass das eigentlich keinen sinn macht
Danke dir fuer deine Funktion damit klappts -
Danke @Kaliber fuer die Loesung des Problems, wobei ich garnicht mehr weiss woran es jetzt ueberhaupt lag

So an alle habe nun folgendes Problem:
Ich will mit meiner Funktion CreateGlobalActor einen Actor erstellen, und vor dem Actor soll halt ein Pickup erstellt werden.
Irgendwie haut das jedoch nicht hin mit meinen beiden Funktionen, wo liegt das Problem?Das Pickup wird irgendwo um den Actor herum erstellt, niemals direkt vor ihm
C
Alles anzeigenstock CreateGlobalActor(actorid,modelid,Float:ax,Float:ay,Float:az,Float:angle,Float:distance,pickupid) { actorid = CreateActor(modelid,ax,ay,az,angle); new Float:x, Float:y, Float:z; GetActorPos(actorid, x, y, z); GetXYInFrontOfActor(actorid, x, y, distance); pickupid = CreatePickup(1210,2,x,y,z,-1); SetActorInvulnerable(actorid, true); printf("Actor %d created, pickupid %d",actorid,pickupid); return pickupid; } stock GetXYInFrontOfActor(actorid, &Float:x, &Float:y, Float:distance) { new Float:a; GetActorPos(actorid, x, y, a); GetActorFacingAngle(actorid, a); x += (distance * floatsin(-a, degrees)); y += (distance * floatcos(-a, degrees)); } -
Ah moin Kaliber

Also das sind die Zeilen wo ich meine Funktion drin habe
C
Alles anzeigenpublic MONEY_TEAM_THREE()//Brown { GenerateRandomPickup(1212,19,MoneySpawns[2][0],MoneySpawns[2][1],MoneySpawns[2][2],MoneySpawns[2][3],MoneySpawns[2][4],MoneySpawns[2][5],0); } //---------------------------------------------------------- public MONEY_TEAM_TWO()//Yellow { GenerateRandomPickup(1212,19,MoneySpawns[1][0],MoneySpawns[1][1],MoneySpawns[1][2],MoneySpawns[1][3],MoneySpawns[1][4],MoneySpawns[1][5],0); } //---------------------------------------------------------- public MONEY_TEAM_ONE()//Violet { GenerateRandomPickup(1212,19,MoneySpawns[0][0],MoneySpawns[0][1],MoneySpawns[0][2],MoneySpawns[0][3],MoneySpawns[0][4],MoneySpawns[0][5],0); } public MONEY_MAIN()//MAIN { GenerateRandomPickup(1212,19,MoneySpawns[3][0],MoneySpawns[3][1],MoneySpawns[3][2],MoneySpawns[3][3],MoneySpawns[3][4],MoneySpawns[3][5],0); }Meine Funktion
C
Alles anzeigenpublic GenerateRandomPickup(modelid,type,Float:x_max,Float:x_min,Float:y_max,Float:y_min,Float:z_max,Float:z_min,virtualworld) { if(maxmoney < 4000) { moneyval= moneyval+1000; new Float:rx1=((frandom((floatabs(x_max-x_min)))+x_min)); new Float:ry2=((frandom((floatabs(y_max-y_min)))+y_min)); new Float:rz3=((frandom((floatabs(z_max-z_min)))+z_min)); maxmoney = maxmoney +1; CreatePickup(modelid,type,rx1,ry2,rz3,virtualworld); printf("%d,%d,%f,%f,%f,%d",modelid,type,rx1,ry2,rz3,virtualworld); } }
Der Compiler sagt es seien folgende Fehler vorhanden:Codeerror 008: must be a constant expression; assumed zero error 001: expected token: "}", but found ";" error 032: array index out of bounds (variable "MoneySpawns") error 032: array index out of bounds (variable "MoneySpawns") error 032: array index out of bounds (variable "MoneySpawns")Error 1: Die 2. Zeile aus dem Array
Error 2:
Leere Zeile nach diesem Zeichen hier
Die anderen 3 Errors jeweils die Zeilen wo ich GenerateRandomPickup einsetze in Verbindung mit dem ArrayKomischerweise ist mein "ackslimit" Problem was ich vorher hatte behoben, wenn ich GenerateRandomPickup nicht nutze, sonst gibt es wieder ackslimit Fehler nach kurzer Zeit.
Ist vielleicht was an der Funktion fehlerhaft? -
Hmm
Also den Error bekomme ich nur wenn ich meine GenerateRandomPickup Funktion nutze -
Mach Mal aus der 6 eine 7 in deinem Array
//edit
//edit2 Fehler behobenLeider klappt das auch nicht
Immernoch Out of bounds
malE:
Leider bringt die Variante den Compiler zum crashen.
-
Gruesse euch
Kriege komischerweise Array Out Of Bounds
Array:
Cnew const Float:MoneySpawns[][6]={ {-2335.7568,-2340.2905,-2023.9417,-2027.9861,270.0450,269.2450},//Violet {-2279.4812,-2283.4812,-1286.3794,-1294.3794,258.9622,258.3622},//Yellow {-2810.7144,-2819.3496,-1493.0504,-1495.6464,139.3078,138.9078},//Brown {-2303.8931,-2337.4104,-1607.2054,-1644.9517,483.7031,482.9031}//Main };Und hier die Zeile wo der Compiler meckert
CGenerateRandomPickup(1212,19,MoneySpawns[1][0],MoneySpawns[1][1],MoneySpawns[1][2],MoneySpawns[1][3],MoneySpawns[1][4],MoneySpawns[1][5],0);
Warum meckert der Compiler? -
Mein Problem hat sich erledigt, dafuer eine neue Frage
Wie kann ich Praeprozessoranweisungen in Strings umsetzen? z.B. hier
#define TEAM_NAME_1 Bla
printf("TEAM_NAME_1");
So wie ich das will sollte da dann eigentlich Bla stehen, jedoch wird dann TEAM_NAME_1 geprintet.Wie kann ich das umgehen?
-
Meinst du das allererste in meinem Gamemode?
Habe das Problem gefunden
Es liegt an meiner CreateGlobalActor Funktion
Ich weiss nicht wo hier der Fehler ist
C
Alles anzeigenstock CreateGlobalActor(actorid,modelid,Float:x,Float:y,Float:z,Float:angle,Float:pickupdist,pickupid) { actorid = CreateActor(modelid,x,y,z,angle); GetXYInFrontOfActor(actorid, x, y, Float:pickupdist); pickupid = CreatePickup(1210,2,x,y,z,-1); SetActorInvulnerable(actorid, true); printf("Actor created, pickupid %d",pickupid); } stock GetXYInFrontOfActor(actorid, &Float:x, &Float:y, Float:distance) { // Created by Knogle new Float:x, Float:y, Float:z; GetActorPos(actorid, x, y, z); new Float:a; GetActorFacingAngle(actorid, a); GetPlayerFacingAngle(actorid, a); x += (distance * floatsin(-a, degrees)); y += (distance * floatcos(-a, degrees)); }Der schwafelt was von preceeding leevel bei Zeile 9 -15
-
-
OnPlayerUpdate sieht wie folgt aus:
C
Alles anzeigenpublic OnPlayerUpdate(playerid) { if(!IsPlayerConnected(playerid)) return 0; if(IsPlayerNPC(playerid)) return 1; // changing teams by inputs if( !gPlayerHasTeamSelected[playerid] && GetPlayerState(playerid) == PLAYER_STATE_SPECTATING ) { ClassSel_HandleTeamSelection(playerid); return 1; } return 1; }Habe ich so 1:1 aus Grand Larc uebernommen, bzw. mein Gamemode basiert auf Grandlarc
-
Ich gruesse euch

Ich erstelle mit meiner Funktion CreateGlobalActor einen Actor, und will in einem Abtand Float:pickupdistance ein Pickup vor den stellen.
Das ist mein Code
C
Alles anzeigenstock CreateGlobalActor(actorid,modelid,Float:x,Float:y,Float:z,Float:angle,Float:pickupdist,pickupid) { actorid = CreateActor(modelid,x,y,z,angle); GetXYInFrontOfActor(actorid, x, y, Float:pickupdist); pickupid = CreatePickup(1210,2,x,y,z,-1); SetActorInvulnerable(actorid, true); } stock GetXYInFrontOfActor(actorid, &Float:x, &Float:y, Float:distance) { // Created by Knogle new Float:x, Float:y, Float:z; GetActorPos(actorid, x, y, z); new Float:a; GetActorFacingAngle(actorid, a); GetPlayerFacingAngle(actorid, a); x += (distance * floatsin(-a, degrees)); y += (distance * floatcos(-a, degrees)); }Was fange ich mit den Fehlern an?
sample.pwn(2033 -- 2042) : warning 219: local variable "x" shadows a variable at a preceding level
sample.pwn(2033 -- 2042) : warning 219: local variable "y" shadows a variable at a preceding levelBetrifft folgende Zeilen
C
Alles anzeigenpickupid = CreatePickup(1210,2,x,y,z,-1); SetActorInvulnerable(actorid, true); } stock GetXYInFrontOfActor(actorid, &Float:x, &Float:y, Float:distance) { // Created by Knogle new Float:x, Float:y, Float:z;
So werden meine Actors erstelltCCreateGlobalActor(1,274,GlobalActors[0][0],GlobalActors[0][1],GlobalActors[0][2],GlobalActors[0][3],2.0,1); CreateGlobalActor(2,274,GlobalActors[1][0],GlobalActors[1][1],GlobalActors[1][2],GlobalActors[1][3],2.0,2); CreateGlobalActor(3,274,GlobalActors[2][0],GlobalActors[2][1],GlobalActors[2][2],GlobalActors[2][3],2.0,3); CreateGlobalActor(4,274,GlobalActors[3][0],GlobalActors[3][1],GlobalActors[3][2],GlobalActors[3][3],2.0,4); CreateGlobalActor(5,274,GlobalActors[4][0],GlobalActors[4][1],GlobalActors[4][2],GlobalActors[4][3],2.0,5); CreateGlobalActor(6,274,GlobalActors[5][0],GlobalActors[5][1],GlobalActors[5][2],GlobalActors[5][3],2.0,6);Weiterhin crasht mein Server nun beim Start haha wie finde ich raus ob es eventuell an kaputten Textdraws liegt oder aehnlich?