Angepinnt [SAMMELTHREAD] Kleine Scripting Fragen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

  • itsMagic. schrieb:

    Wie muss ich nun mit einer Schleife vorgehen, das er Beachtet welches Geschlecht er ist und welche Fraktion er ist.
    Und das er dann natürlich nur den Skin aus meiner Liste Erhält.
    Das könntest du so lösen:

    C-Quellcode

    1. stock GetRandomSkin(playerid, gender, fraktion)
    2. {
    3. new counter, str[10];
    4. for(new i; i<sizeof(SkinData); i++)
    5. {
    6. if(SkinData[i][skinGender] != geneder || SkinData[i][skinFraktion] != fraktion) continue;
    7. format(str,sizeof(str),"r!s_%d",counter++),
    8. SetPVarInt(playerid,str,SkinData[i][skinID]);
    9. }
    10. if(!counter) return -1;
    11. format(str,sizeof(str),"r!s_%d",random(counter));
    12. new final_skin = GetPVarInt(playerid,str);
    13. for(new i=counter-1; i!=-1; i--)
    14. {
    15. format(str,sizeof(str),"r!s_%d",i),
    16. DeletePVar(playerid,str);
    17. }
    18. return final_skin;
    19. }
    Alles anzeigen



    Beispiel Nutzung:

    C-Quellcode

    1. new skin = GetRandomSkin(playerid, gender, fraktion);
    2. if(skin == -1) return -1; //Fehler, weil kein Skin mit diesen Kriterien gefunden!!
    3. SetPlayerSkin(playerid, skin);
    Erklärung wie funktioniert der Code?

    Spoiler anzeigen
    Also am Anfang werden 2 Variablen erstellt.
    counter dient dazu mit zu zählen, wie viele Skins in Frage kämen mit den passenden Kriterien.
    str in dieser Variable wird einfach nur der String gespeichert.

    Anschließend kommt die Schleife, wo jeder Skin durchgegangen wird und geprüft wird, ob das Geschlecht & die Fraktion dem Skin entsprechen würden.
    Dieser wird anschließend in einem PVar gespeichert und der counter natürlich um 1 hochgezählt.

    Ist nach der Schleife der counter 0 wissen wir, dass kein Skin gefunden wurde. (also return -1)

    Nun wird aus den Skins, die potentiell in Frage kämen einer zufällig ausgewählt. (und zwischengespeichert)

    Anschließend werden alle PVars wieder gelöscht, weil brauchen wir ja jetzt nicht mehr.

    Und der finale-Skin wird zurückgegeben :)


    Noch ein Mini Vorschlag:
    Spoiler anzeigen

    Nutze stock const anstatt new bei deinen SkinData.
    Da das ja quasi keine Variable ist, hier wird nichts mehr verändert (während der Laufzeit), das sind ja alles Konstanten :)
    Deshalb gebe das so an, dann kann der Compiler das besser im Speicher optimieren.

    C-Quellcode

    1. stock const SkinData[MAX_SKIN_DATA][e_SkinData] = {
    2. {2, 1, 0}, {6, 1, 0}, {7, 1, 0}, {15, 1, 0}, {19, 1, 0}, {21, 1, 0}, {22, 1, 0}, {23, 1, 0}, {26, 1, 0}, {29, 1, 0},
    3. {11, 2, 0}, {12, 2, 0}, {13, 2, 0}, {41, 2, 0}, {54, 2, 0}, {55, 2, 0}, {69, 2, 0}, {90, 2, 0}, {93, 2, 0}, {192, 2, 0}
    4. };
    Desweiteren brauchst du theoretisch dieses MAX_SKIN_DATA nicht.
    Das verwirrt meiner Meinung nach nur irgendwie xD

    Schreibe es einfach so:


    C-Quellcode

    1. stock const SkinData[][e_SkinData] = {
    2. {2, 1, 0}, {6, 1, 0}, {7, 1, 0}, {15, 1, 0}, {19, 1, 0}, {21, 1, 0}, {22, 1, 0}, {23, 1, 0}, {26, 1, 0}, {29, 1, 0},
    3. {11, 2, 0}, {12, 2, 0}, {13, 2, 0}, {41, 2, 0}, {54, 2, 0}, {55, 2, 0}, {69, 2, 0}, {90, 2, 0}, {93, 2, 0}, {192, 2, 0}
    4. };
    Und wie viele Elemente jetzt im Array sind, kannst du einfach mit:

    sizeof(SkinData) abfragen.

    Keine Angst, von der Performanz her macht das keinen Unterschied, da das vom Pre-Compiler auch ersetzt wird durch eine konstante Zahl, wie das Makro :)


    Hoffe ich hatte dich richtig verstanden und die Antwort hilft dir weiter! :)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Steht doch in dem Link von Kaliber...
    forum.sa-mp.com/showthread.php?t=608474

    Canna schrieb:

    Guten Tag
    Der freundlichste User, der, der immer an seinen Gruß gedacht hat und seine Duftmarke hinterlassen muss. Der User mit den meisten Pinnwandeinträgen ist ebenfalls @Rocky Balboa mit aussagekräftigen 98 Einträgen.

    Canna schrieb:

    Die meisten Beiträge
    Natürlich beginnen wir mit den meisten Beiträgen. Derjenige, der sich 24/7 (mehr oder weniger) die Finger wund schreibt ist mit 1.318 Beiträgen zum zweiten Mal in Folge der User mit den meisten Beiträgen im Jahr 2018, @Rocky Balboa.

    dennismitzwein schrieb:

    Die meisten Beiträge
    Der eifrigste Tastaturklimperer, derjenige, welcher mehr Muskeln in den Fingern besitzt als die meisten von euch im Bizeps haben. Mit ganzen 1524 Beiträgen ist @Rocky Balboa der User mit den meisten geschriebenen Beiträgen im gesamten Jahr 2017
  • wie kann ich ein frak carrespawn machen?
    bei mir compilet der einfach nicht wenn ich das so habe, kann mir jemand helfen?


    PAWN-Quellcode

    1. if(dialogid == DIALOG_Frakcars)
    2. {
    3. if(response)
    4. {
    5. if(listitem == 0)
    6. {
    7. for(new v=0; v<LSPDCar; v++)
    8. {
    9. if(GetVehicleDriver(v) == -1)
    10. {
    11. SetVehicleToRespawn(v);
    12. SetVehicleHealth(v,1000);
    13. format(string, sizeof(string), "%s hat die Fraktionsfahrzeuge der Fraktion LSPD [ID: 1]respawnt.", sendername);
    14. ABroadCast(COLOR_YELLOW,string,1);
    15. return 1;
    16. }
    17. }
    18. }
    19. }
    20. if(listitem == 1)
    21. {
    22. for(new v=0; v<fbicar; v++)
    23. {
    24. if(GetVehicleDriver(v) == -1)
    25. {
    26. SetVehicleToRespawn(v);
    27. SetVehicleHealth(v,1000);
    28. format(string, sizeof(string), "%s hat die Fraktionsfahrzeuge der Fraktion FBI [ID: 2]respawnt.", sendername);
    29. ABroadCast(COLOR_YELLOW,string,1);
    30. return 1;
    31. }
    32. }
    33. }
    34. }
    35. }
    36. }
    Alles anzeigen
  • Nima.Yaghobi schrieb:

    bei mir compilet der einfach nicht wenn ich das so habe, kann mir jemand helfen?
    Da ist vermutlich ein Klammerfehler und deine Schleifen sind falsch...

    Aber ich würd dir eh empfehlen, es so zu schreiben:

    C-Quellcode

    1. if(dialogid == DIALOG_Frakcars)
    2. {
    3. if(!response) return 1;
    4. RespawnFrakVehicles(listitem);
    5. format(string, sizeof(string), "%s hat die Fraktionsfahrzeuge der Fraktion LSPD [ID: %d]respawnt.", sendername,listitem+1);
    6. ABroadCast(COLOR_YELLOW,string,1);
    7. }
    8. //Irgendwo außerhalb
    9. stock RespawnFrakVehicles(frak)
    10. {
    11. switch(frak)
    12. {
    13. case 0:
    14. {
    15. for(new i,v; i<sizeof(LSPDCar); i++)
    16. {
    17. v = LSPDCar[i];
    18. if(GetVehicleDriver(v) != -1) SetVehicleToRespawn(v),SetVehicleHealth(v,1000);
    19. }
    20. }
    21. case 1:
    22. {
    23. for(new i,v; i<sizeof(fbicar); i++)
    24. {
    25. v = fbicar[i];
    26. if(GetVehicleDriver(v) != -1) SetVehicleToRespawn(v),SetVehicleHealth(v,1000);
    27. }
    28. }
    29. }
    30. return 1;
    31. }
    Alles anzeigen


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Nein das geht nicht.

    Canna schrieb:

    Guten Tag
    Der freundlichste User, der, der immer an seinen Gruß gedacht hat und seine Duftmarke hinterlassen muss. Der User mit den meisten Pinnwandeinträgen ist ebenfalls @Rocky Balboa mit aussagekräftigen 98 Einträgen.

    Canna schrieb:

    Die meisten Beiträge
    Natürlich beginnen wir mit den meisten Beiträgen. Derjenige, der sich 24/7 (mehr oder weniger) die Finger wund schreibt ist mit 1.318 Beiträgen zum zweiten Mal in Folge der User mit den meisten Beiträgen im Jahr 2018, @Rocky Balboa.

    dennismitzwein schrieb:

    Die meisten Beiträge
    Der eifrigste Tastaturklimperer, derjenige, welcher mehr Muskeln in den Fingern besitzt als die meisten von euch im Bizeps haben. Mit ganzen 1524 Beiträgen ist @Rocky Balboa der User mit den meisten geschriebenen Beiträgen im gesamten Jahr 2017

  • BrightLeaN schrieb:

    Kann ich irgendwie alle Objektpositionen vom Objekt z.b 295 herausfinden? (Normale Objekte keine erstellten)
    Ich habe nichts gefunden.

    //Seite hat nicht geladen
    Diese Seite sollte dir helfen. Wählst du ein Objekt dort aus, kannst du unten links die Koordinaten sehen, wo sich das Objekt überall befindet.

    Beispiel:
    dev.prineside.com/en/gtasa_sam…del/3174-sm_airstrm_sml_/

    Siehe unten rechts.
  • BrightLeaN schrieb:

    und das wollte ich jetzt testen
    Nur zur Info, du musst das nicht alles selbst schreiben, da gab es schon einige vor dir:

    forum.sa-mp.com/showthread.php?t=646429
    forum.sa-mp.com/showthread.php?t=509952
    forum.sa-mp.com/showthread.php?t=301328

    Vielleicht hilft dir das ja ein wenig weiter :)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Danke nochmal fuer die Makro Variante fuer das Sprachensystem.
    Leider ist in diesem Fall doch eher eine andere Variante via Funktion gewuenscht.
    Ich habe das mal so gemacht, interessanterweise reconnected der Spieler wenn das hier ausgefuehrt wird :D Sowas habe ich vorher noch nicht geschafft.

    C-Quellcode

    1. stock SendMessageEx(playerid, color, Language1[], Language2[] , Language3[], {Float, _}:...)
    2. {
    3. #define BYTECOUNT (cellbits / 8)
    4. if(playerid == -1)
    5. {
    6. for(new i; i<MAX_PLAYERS;i++)
    7. {
    8. if(!IsPlayerConnected(i)) continue;
    9. if(IsPlayerNPC(i)) continue;
    10. switch( player_Language[i] )
    11. {
    12. case 0: //Language 1
    13. {
    14. static const
    15. ARGC = 3;
    16. new n = (numargs() - ARGC) * BYTECOUNT;
    17. if (n)
    18. {
    19. new message[128], arg_start, arg_end;
    20. #emit CONST.alt Language1
    21. #emit LCTRL 5
    22. #emit ADD
    23. #emit STOR.S.pri arg_start
    24. #emit LOAD.S.alt n
    25. #emit ADD
    26. #emit STOR.S.pri arg_end
    27. do
    28. {
    29. #emit LOAD.I
    30. #emit PUSH.pri
    31. arg_end -= BYTECOUNT;
    32. #emit LOAD.S.pri arg_end
    33. }
    34. while (arg_end > arg_start);
    35. #emit PUSH.S Language1
    36. #emit PUSH.C 128
    37. #emit PUSH.ADR message
    38. n += BYTECOUNT * 3;
    39. #emit PUSH.S n
    40. #emit SYSREQ.C format
    41. n += BYTECOUNT;
    42. #emit LCTRL 4
    43. #emit LOAD.S.alt n
    44. #emit ADD
    45. #emit SCTRL 4
    46. return SendClientMessage(i, color, message);
    47. }
    48. }
    49. case 1: //Language 2
    50. {
    51. static const
    52. ARGC = 3;
    53. new n = (numargs() - ARGC) * BYTECOUNT;
    54. if (n)
    55. {
    56. new message[128], arg_start, arg_end;
    57. #emit CONST.alt Language2
    58. #emit LCTRL 5
    59. #emit ADD
    60. #emit STOR.S.pri arg_start
    61. #emit LOAD.S.alt n
    62. #emit ADD
    63. #emit STOR.S.pri arg_end
    64. do
    65. {
    66. #emit LOAD.I
    67. #emit PUSH.pri
    68. arg_end -= BYTECOUNT;
    69. #emit LOAD.S.pri arg_end
    70. }
    71. while (arg_end > arg_start);
    72. #emit PUSH.S Language2
    73. #emit PUSH.C 128
    74. #emit PUSH.ADR message
    75. n += BYTECOUNT * 3;
    76. #emit PUSH.S n
    77. #emit SYSREQ.C format
    78. n += BYTECOUNT;
    79. #emit LCTRL 4
    80. #emit LOAD.S.alt n
    81. #emit ADD
    82. #emit SCTRL 4
    83. return SendClientMessage(i, color, message);
    84. }
    85. }
    86. case 2: //Language 3
    87. {
    88. static const
    89. ARGC = 3;
    90. new n = (numargs() - ARGC) * BYTECOUNT;
    91. if (n)
    92. {
    93. new message[128], arg_start, arg_end;
    94. #emit CONST.alt Language3
    95. #emit LCTRL 5
    96. #emit ADD
    97. #emit STOR.S.pri arg_start
    98. #emit LOAD.S.alt n
    99. #emit ADD
    100. #emit STOR.S.pri arg_end
    101. do
    102. {
    103. #emit LOAD.I
    104. #emit PUSH.pri
    105. arg_end -= BYTECOUNT;
    106. #emit LOAD.S.pri arg_end
    107. }
    108. while (arg_end > arg_start);
    109. #emit PUSH.S Language3
    110. #emit PUSH.C 128
    111. #emit PUSH.ADR message
    112. n += BYTECOUNT * 3;
    113. #emit PUSH.S n
    114. #emit SYSREQ.C format
    115. n += BYTECOUNT;
    116. #emit LCTRL 4
    117. #emit LOAD.S.alt n
    118. #emit ADD
    119. #emit SCTRL 4
    120. return SendClientMessage(i, color, message);
    121. }
    122. }
    123. }
    124. }
    125. }
    126. else
    127. {
    128. switch( player_Language[playerid] )
    129. {
    130. case 0: //Language 1
    131. {
    132. static const
    133. ARGC = 3;
    134. new n = (numargs() - ARGC) * BYTECOUNT;
    135. if (n)
    136. {
    137. new message[128], arg_start, arg_end;
    138. #emit CONST.alt Language1
    139. #emit LCTRL 5
    140. #emit ADD
    141. #emit STOR.S.pri arg_start
    142. #emit LOAD.S.alt n
    143. #emit ADD
    144. #emit STOR.S.pri arg_end
    145. do
    146. {
    147. #emit LOAD.I
    148. #emit PUSH.pri
    149. arg_end -= BYTECOUNT;
    150. #emit LOAD.S.pri arg_end
    151. }
    152. while (arg_end > arg_start);
    153. #emit PUSH.S Language1
    154. #emit PUSH.C 128
    155. #emit PUSH.ADR message
    156. n += BYTECOUNT * 3;
    157. #emit PUSH.S n
    158. #emit SYSREQ.C format
    159. n += BYTECOUNT;
    160. #emit LCTRL 4
    161. #emit LOAD.S.alt n
    162. #emit ADD
    163. #emit SCTRL 4
    164. return SendClientMessage(playerid, color, message);
    165. }
    166. }
    167. case 1: //Language 2
    168. {
    169. static const
    170. ARGC = 3;
    171. new n = (numargs() - ARGC) * BYTECOUNT;
    172. if (n)
    173. {
    174. new message[128], arg_start, arg_end;
    175. #emit CONST.alt Language2
    176. #emit LCTRL 5
    177. #emit ADD
    178. #emit STOR.S.pri arg_start
    179. #emit LOAD.S.alt n
    180. #emit ADD
    181. #emit STOR.S.pri arg_end
    182. do
    183. {
    184. #emit LOAD.I
    185. #emit PUSH.pri
    186. arg_end -= BYTECOUNT;
    187. #emit LOAD.S.pri arg_end
    188. }
    189. while (arg_end > arg_start);
    190. #emit PUSH.S Language2
    191. #emit PUSH.C 128
    192. #emit PUSH.ADR message
    193. n += BYTECOUNT * 3;
    194. #emit PUSH.S n
    195. #emit SYSREQ.C format
    196. n += BYTECOUNT;
    197. #emit LCTRL 4
    198. #emit LOAD.S.alt n
    199. #emit ADD
    200. #emit SCTRL 4
    201. return SendClientMessage(playerid, color, message);
    202. }
    203. }
    204. case 2: //Language 3
    205. {
    206. static const
    207. ARGC = 3;
    208. new n = (numargs() - ARGC) * BYTECOUNT;
    209. if (n)
    210. {
    211. new message[128], arg_start, arg_end;
    212. #emit CONST.alt Language3
    213. #emit LCTRL 5
    214. #emit ADD
    215. #emit STOR.S.pri arg_start
    216. #emit LOAD.S.alt n
    217. #emit ADD
    218. #emit STOR.S.pri arg_end
    219. do
    220. {
    221. #emit LOAD.I
    222. #emit PUSH.pri
    223. arg_end -= BYTECOUNT;
    224. #emit LOAD.S.pri arg_end
    225. }
    226. while (arg_end > arg_start);
    227. #emit PUSH.S Language3
    228. #emit PUSH.C 128
    229. #emit PUSH.ADR message
    230. n += BYTECOUNT * 3;
    231. #emit PUSH.S n
    232. #emit SYSREQ.C format
    233. n += BYTECOUNT;
    234. #emit LCTRL 4
    235. #emit LOAD.S.alt n
    236. #emit ADD
    237. #emit SCTRL 4
    238. return SendClientMessage(playerid, color, message);
    239. }
    240. }
    241. }
    242. }
    243. return true;
    244. }
    Alles anzeigen
  • Ich habe ein Array voller Koordinaten, zu diesen will ich per Zufall eine aussuchen (x,y,z) und abfragen, ob diese eine Koordinate schon benutzt wurde, damit er beim zweiten mal dort kein Checkpoint kriegt, sondern
    dann eine noch nicht benutzte Koordinate rausgesucht wird.
    Ist etwas für ein Job

    was wäre das schlauste?
    Wenn ich ein Enum dazu erstelle und dort z.b 0 eintrage, kann ich dann beim setzten da die 1 setzten und später abfragen ob es auf 1 ist?
    Das geht ja alles nicht über Playerid oder?

    Quellcode

    1. stock const Float:trash1[][] =
    2. {
    3. {770.2623,-1260.5071,12.4866}, // 1
    4. {-69.7510,-1624.0002,12.4859,0}, // enum Beispiel
    5. //...
    6. };

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Kaliber schrieb:

    Sub Royal schrieb:

    Leider ist in diesem Fall doch eher eine andere Variante via Funktion gewuenscht.
    Wieso? :o
    Leider gibt es da doch Errors :/
    Wuerde dann auch gerne die funktionierend SendMessageEx Funktion nutzen um das ganze bspw. fuer Dialoge und GameTexts als auch TextDraw Strings abzuwandeln.
    Leider werde ich aus dem #emit Kram nicht schlau, kann man die Funktion denn auch mit format etc. ausdruecken? Das Problem ist ja irgendwie die Argumente hinten zu erfassen.


    Gibt es uebrigends auch die Moeglichkeit bei zcmd, bzw. izcmd sowas wie alias einzurichten?
    So dass ich bspw. die Hilfe nicht einfach mit /ayuda aufmachen kann, sondern mit /ayuda /ajuda und /help, alles fuer den gleichen Befehl.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Sub Royal ()