Buisiness Laden ... Unterscheiden welcher Typ

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

  • Buisiness Laden ... Unterscheiden welcher Typ

    Moin,

    ich baue gerade mein Biz System ... Ich möchte allerdings mein System "Dynamisch" aufbauen. Ich habe angefangen mit der Unterscheidung ob es eine Tankstelle ist... Leider funktioniert es nicht so ganz...

    Meine enums:


    Quellcode

    1. enum bizData{
    2. db_id,
    3. biz_id,
    4. biz_typ,
    5. biz_name[64],
    6. biz_owner,
    7. biz_sowner,
    8. int_id,
    9. biz_level,
    10. Float:biz_kosten,
    11. Float:biz_kasse,
    12. Float:enter_x,
    13. Float:enter_y,
    14. Float:enter_z,
    15. Float:int_x,
    16. Float:int_y,
    17. Float:int_z,
    18. Float:i_x,
    19. Float:i_y,
    20. Float:i_z
    21. }
    22. new bInfo[][bizData];
    23. enum tankData{
    24. db_id,
    25. t_typ,
    26. Float:t_x,
    27. Float:t_y,
    28. Float:t_z,
    29. t_range,
    30. Float:benzin_vol,
    31. Float:diesel_vol,
    32. Float:gas_vol,
    33. Float:kerosin_vol,
    34. Float:benzin_preis,
    35. Float:diesel_preis,
    36. Float:gas_preis,
    37. Float:kerosin_preis
    38. }
    39. new tankInfo[][tankData];
    Alles anzeigen




    OnGameModeInit:

    Quellcode

    1. //Lade Geschäfte
    2. new query[2048];
    3. mysql_format(handle, query, sizeof(query), "SELECT * FROM geschaefte");
    4. mysql_pquery(handle, query, "loadBizzes");
    meine callbacks:

    Quellcode

    1. public loadBizzes(){
    2. new rows;
    3. cache_get_row_count(rows);
    4. if(rows == 0) return 1;
    5. for(new i = 0; i < rows; i++){
    6. new id = getFreeBizID();
    7. cache_get_value_name_int(i, "id", bInfo[id][db_id]);
    8. cache_get_value_name_int(i, "biz_typ", bInfo[id][biz_typ]);
    9. cache_get_value_name(i, "biz_name", bInfo[id][biz_name], 128);
    10. cache_get_value_name_int(i, "biz_owner", bInfo[id][biz_owner]);
    11. cache_get_value_name_int(i, "biz_sowner", bInfo[id][biz_sowner]);
    12. cache_get_value_name_int(i, "biz_level", bInfo[id][biz_level]);
    13. cache_get_value_name_int(i, "int_id", bInfo[id][int_id]);
    14. cache_get_value_name_float(i, "bizkosten", bInfo[id][biz_kosten]);
    15. cache_get_value_name_float(i, "bizkasse", bInfo[id][biz_kasse]);
    16. cache_get_value_name_float(i, "enter_x", bInfo[id][enter_x]);
    17. cache_get_value_name_float(i, "enter_y", bInfo[id][enter_y]);
    18. cache_get_value_name_float(i, "enter_z", bInfo[id][enter_z]);
    19. cache_get_value_name_float(i, "int_x", bInfo[id][int_x]);
    20. cache_get_value_name_float(i, "int_y", bInfo[id][int_y]);
    21. cache_get_value_name_float(i, "int_z", bInfo[id][int_z]);
    22. cache_get_value_name_float(i, "i_x", bInfo[id][i_x]);
    23. cache_get_value_name_float(i, "i_y", bInfo[id][i_y]);
    24. cache_get_value_name_float(i, "i_z", bInfo[id][i_z]);
    25. bInfo[id][id_x] = bInfo[id][db_id];
    26. if(bInfo[id][biz_typ] == 1){
    27. new query[1024];
    28. mysql_format(handle, query, sizeof(query), "SELECT * FROM new_tankstellen WHERE id = '%i'", bInfo[id][db_id]);
    29. mysql_pquery(handle, query, "loadTanke", "i", i);
    30. }
    31. }
    32. return 1;
    33. }
    34. public loadTanke(dbid){
    35. new rows, tankeCount, string[128];
    36. cache_get_row_count(rows);
    37. if(rows == 0) return 1;
    38. for(new i = 0; i < rows; i++){
    39. cache_get_value_name_int(i, "id", tankInfo[dbid][db_id]);
    40. cache_get_value_name_int(i, "t_typ", tankInfo[dbid][t_typ]);
    41. cache_get_value_name_float(i, "t_x", tankInfo[dbid][t_x]);
    42. cache_get_value_name_float(i, "t_y", tankInfo[dbid][t_y]);
    43. cache_get_value_name_float(i, "t_z", tankInfo[dbid][t_z]);
    44. cache_get_value_name_int(i, "t_range", tankInfo[dbid][t_range]);
    45. cache_get_value_name_float(i, "benzin_vol", tankInfo[dbid][benzin_vol]);
    46. cache_get_value_name_float(i, "diesel_vol", tankInfo[dbid][diesel_vol]);
    47. cache_get_value_name_float(i, "gas_vol", tankInfo[dbid][gas_vol]);
    48. cache_get_value_name_float(i, "kerosin_vol", tankInfo[dbid][kerosin_vol]);
    49. cache_get_value_name_float(i, "benzin_preis", tankInfo[dbid][benzin_preis]);
    50. cache_get_value_name_float(i, "diesel_preis", tankInfo[dbid][diesel_preis]);
    51. cache_get_value_name_float(i, "gas_preis", tankInfo[dbid][gas_preis]);
    52. cache_get_value_name_float(i, "kerosin_preis", tankInfo[dbid][kerosin_preis]);
    53. tankInfo[dbid][id_x] = tankInfo[dbid][db_id];
    54. printf("Tankstelle: %s | X: %f | Y: %f | Z: %f | ID: %i geladen", bInfo[dbid][biz_name], bInfo[dbid][enter_x], bInfo[dbid][enter_y], bInfo[dbid][enter_z], tankInfo[dbid][id_x]);
    55. format(string, sizeof(string), "%s", bInfo[i][biz_name]);
    56. tankLabel[bInfo[i][id_x]] = Create3DTextLabel(string, COLOR_WHITE, bInfo[i][enter_x], bInfo[i][enter_y], bInfo[i][enter_z], 15, 0, 1);
    57. tankeCount += 1;
    58. }
    59. print("|__________Tankstellen wurden geladen__________|");
    60. printf("Es wurden %i Tankstellen geladen", tankeCount);
    61. return 1;
    62. }
    Alles anzeigen
    Die Forwards:

    Quellcode

    1. //Geschäfte
    2. forward loadBizzes();
    3. forward loadTanke(bizid);
    Als ergebnis steht in der Konsole:


    Quellcode

    1. [14:23:45] Tankstelle: GS Tanke | X: 1928.579956 | Y: -1776.229980 | Z: 13.546899 | ID: 2 geladen
    2. [14:23:45] |__________Tankstellen wurden geladen__________|
    3. [14:23:45] Es wurden 1 Tankstellen geladen
    4. [14:23:45] Tankstelle: BSN Tanke | X: 1000.590026 | Y: -919.880004 | Z: 42.328098 | ID: 1 geladen
    5. [14:23:45] |__________Tankstellen wurden geladen__________|
    6. [14:23:45] Es wurden 1 Tankstellen geladen

    //EDIT Nachdem ich das erste Problem gelöst habe, habe ich nun ein weiteres kleines Problem^^


    MfG
    XonarZ

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von XonarZ ()

  • Was geht denn nicht?

    Dass dir das doppelt angezeigt wird liegt nur daran, dass das immer alles einzeln geladen wird.

    Solltest das so schreiben:

    C-Quellcode

    1. public loadBizzes(){
    2. new rows;
    3. cache_get_row_count(rows);
    4. if(rows == 0) return 1;
    5. new tank_counter;
    6. for(new i,query[200]; i < rows; i++){
    7. cache_get_value_name_int(i, "id", bInfo[i][db_id]);
    8. cache_get_value_name_int(i, "biz_typ", bInfo[i][biz_typ]);
    9. cache_get_value_name(i, "biz_name", bInfo[i][biz_name], 128);
    10. cache_get_value_name_int(i, "biz_owner", bInfo[i][biz_owner]);
    11. cache_get_value_name_int(i, "biz_sowner", bInfo[i][biz_sowner]);
    12. cache_get_value_name_int(i, "biz_level", bInfo[i][biz_level]);
    13. cache_get_value_name_int(i, "int_id", bInfo[i][int_id]);
    14. cache_get_value_name_float(i, "bizkosten", bInfo[i][biz_kosten]);
    15. cache_get_value_name_float(i, "bizkasse", bInfo[i][biz_kasse]);
    16. cache_get_value_name_float(i, "enter_x", bInfo[i][enter_x]);
    17. cache_get_value_name_float(i, "enter_y", bInfo[i][enter_y]);
    18. cache_get_value_name_float(i, "enter_z", bInfo[i][enter_z]);
    19. cache_get_value_name_float(i, "int_x", bInfo[i][int_x]);
    20. cache_get_value_name_float(i, "int_y", bInfo[i][int_y]);
    21. cache_get_value_name_float(i, "int_z", bInfo[i][int_z]);
    22. cache_get_value_name_float(i, "i_x", bInfo[i][i_x]);
    23. cache_get_value_name_float(i, "i_y", bInfo[i][i_y]);
    24. cache_get_value_name_float(i, "i_z", bInfo[i][i_z]);
    25. bInfo[i][id_x] = bInfo[i][db_id];
    26. if(bInfo[i][biz_typ] == 1){
    27. tank_counter++;
    28. mysql_format(handle, query, sizeof(query), "SELECT * FROM new_tankstellen WHERE id = '%i'", bInfo[i][db_id]);
    29. mysql_pquery(handle, query, "loadTanke", "i", i);
    30. }
    31. }
    32. print("|__________Tankstellen wurden geladen__________|");
    33. printf("Es wurden %i Tankstellen geladen", tank_counter);
    34. return 1;
    35. }
    36. public loadTanke(dbid){
    37. new rows;
    38. cache_get_row_count(rows);
    39. if(rows == 0) return 1;
    40. new string[128];
    41. cache_get_value_name_int(0, "id", tankInfo[dbid][db_id]);
    42. cache_get_value_name_int(0, "t_typ", tankInfo[dbid][t_typ]);
    43. cache_get_value_name_float(0, "t_x", tankInfo[dbid][t_x]);
    44. cache_get_value_name_float(0, "t_y", tankInfo[dbid][t_y]);
    45. cache_get_value_name_float(0, "t_z", tankInfo[dbid][t_z]);
    46. cache_get_value_name_int(0, "t_range", tankInfo[dbid][t_range]);
    47. cache_get_value_name_float(0, "benzin_vol", tankInfo[dbid][benzin_vol]);
    48. cache_get_value_name_float(0, "diesel_vol", tankInfo[dbid][diesel_vol]);
    49. cache_get_value_name_float(0, "gas_vol", tankInfo[dbid][gas_vol]);
    50. cache_get_value_name_float(0, "kerosin_vol", tankInfo[dbid][kerosin_vol]);
    51. cache_get_value_name_float(0, "benzin_preis", tankInfo[dbid][benzin_preis]);
    52. cache_get_value_name_float(0, "diesel_preis", tankInfo[dbid][diesel_preis]);
    53. cache_get_value_name_float(0, "gas_preis", tankInfo[dbid][gas_preis]);
    54. cache_get_value_name_float(0, "kerosin_preis", tankInfo[dbid][kerosin_preis]);
    55. tankInfo[dbid][id_x] = tankInfo[dbid][db_id];
    56. printf("Tankstelle: %s | X: %f | Y: %f | Z: %f | ID: %i geladen", bInfo[dbid][biz_name], bInfo[dbid][enter_x], bInfo[dbid][enter_y], bInfo[dbid][enter_z], tankInfo[dbid][id_x]);
    57. format(string, sizeof(string), "%s", bInfo[dbid][biz_name]);
    58. tankLabel[bInfo[dbid][id_x]] = Create3DTextLabel(string, COLOR_WHITE, bInfo[dbid][enter_x], bInfo[dbid][enter_y], bInfo[dbid][enter_z], 15, 0, 1);
    59. return 1;
    60. }
    Alles anzeigen
    Das Problem das ich hier sehe ist Array-Verschwendung.

    Also man kann es so lösen, aber das ist nicht gerade elegant, da wenn du z.B. 100 Unternehmen hast und davon ist index 30 und index 98 eine Tankstelle.

    Dann steht in tankInfo[30] etwas und in tankInfo[98] etwas.

    Der ganze Rest ist leer.

    Bräuchtest also eigentlich auch nur tankInfo[0] und tankInfo[1], sprich 2 Cells, wohingegen du hier 100 reservierst.

    Aber gut...das nur mal als Anmerkung.

    Und in Zeile 56 von meinem Code, da wolltest du doch bInfo[dbid][id_x] schreiben, oder? ^^

    Des weiteren wäre das effizienter nicht für jede Tankstelle einen Query auszuführen, sondern einfach einen JOIN zu benutzen und dann alle Tankstellen auf einmal zu laden.


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • ich habe nun mal eine neue idee ausprobiert leider irgendwo einen denkfehler... Undzwar wie folgt:

    OnGameModeInit

    Quellcode

    1. //Geschäfte
    2. new query[2048];
    3. mysql_format(handle, query, sizeof(query), "SELECT * FROM geschaefte");
    4. mysql_pquery(handle, query, "OnLoadBiz");
    5. //Tankstellen
    6. mysql_format(handle, query, sizeof(query), "SELECT * FROM new_tankstellen");
    7. mysql_pquery(handle, query, "OnLoadTanke");


    Callbacks & 1 Stock

    Quellcode

    1. public OnLoadBiz(){
    2. new rows, string[128];
    3. cache_get_row_count(rows);
    4. if(rows == 0) return 1;
    5. for(new i = 0; i < rows; i++){
    6. new id = getFreeBizID();
    7. cache_get_value_name_int(i, "id", bInfo[id][biz_id]);
    8. cache_get_value_name_int(i, "biz_typ", bInfo[id][biz_typ]);
    9. cache_get_value_name(i, "biz_name", bInfo[id][biz_name], 128);
    10. cache_get_value_name_int(i, "biz_owner", bInfo[id][biz_owner]);
    11. cache_get_value_name_int(i, "biz_sowner", bInfo[id][biz_sowner]);
    12. cache_get_value_name_int(i, "biz_level", bInfo[id][biz_level]);
    13. cache_get_value_name_int(i, "int_id", bInfo[id][int_id]);
    14. cache_get_value_name_float(i, "bizkosten", bInfo[id][biz_kosten]);
    15. cache_get_value_name_float(i, "bizkasse", bInfo[id][biz_kasse]);
    16. cache_get_value_name_float(i, "biz_x", bInfo[id][biz_x]);
    17. cache_get_value_name_float(i, "biz_y", bInfo[id][biz_y]);
    18. cache_get_value_name_float(i, "biz_z", bInfo[id][biz_z]);
    19. cache_get_value_name_float(i, "int_x", bInfo[id][int_x]);
    20. cache_get_value_name_float(i, "int_y", bInfo[id][int_y]);
    21. cache_get_value_name_float(i, "int_z", bInfo[id][int_z]);
    22. cache_get_value_name_float(i, "i_x", bInfo[id][i_x]);
    23. cache_get_value_name_float(i, "i_y", bInfo[id][i_y]);
    24. cache_get_value_name_float(i, "i_z", bInfo[id][i_z]);
    25. if(bInfo[id][biz_owner] == 0){
    26. format(string, 256, "{00AFFF}%s - Zum Verkauf\n{00AFFF}Kosten: {FFFFFF}%0.0f €\n{00AFFF}Benötigtes Level: {FFFFFF}%i\n\nZum Betreten /enter oder Z", bInfo[id][biz_name], bInfo[id][biz_kosten], bInfo[id][biz_level]);
    27. }else{
    28. new teilhaber[MAX_PLAYER_NAME];
    29. if(bInfo[id][biz_sowner] == 0){
    30. teilhaber = "Niemand";
    31. }else{
    32. teilhaber = getSpielerName(bInfo[id][biz_sowner]);
    33. }
    34. format(string, 256, "{00AFFF}%s\nInhaber: {FFFFFF}%s\n{00AFFF}Teilhaber: {FFFFFF}%s\n\nZum Betreten /enter oder Z", bInfo[id][biz_name], getSpielerName(bInfo[id][biz_owner]), teilhaber);
    35. }
    36. bizLabel[id] = Create3DTextLabel(string, COLOR_WHITE, bInfo[id][biz_x], bInfo[id][biz_y], bInfo[id][biz_z], 10, 0, 0);
    37. }
    38. print("|__________Geschäfte wurden Geladen__________|");
    39. return 1;
    40. }
    41. stock getBizID(){
    42. for(new i = 0; i < sizeof(bInfo); i++){
    43. if(bInfo[i][biz_id] == 0) continue;
    44. return bInfo[i][biz_id];
    45. }
    46. return 0;
    47. }
    48. public OnLoadTanke(){
    49. new rows;
    50. cache_get_row_count(rows);
    51. if(rows == 0) return 1;
    52. for(new i = 0; i < rows; i++){
    53. print("1");
    54. new id = getBizID(), dbID, string[256];
    55. print("2");
    56. cache_get_value_name_int(i, "id", dbID);
    57. print("3");
    58. printf("id: %i | dbid: %i", id, dbID);
    59. if(id != dbID) continue;
    60. print("4");
    61. }
    62. return 1;
    63. }
    Alles anzeigen
    Geschäfte werden auch geladen (Textdraws erstellt usw)... Nun habe ich aber das Problem das mir die Konsole folgendes ausgibt:


    Quellcode

    1. [13:21:47] |__________Geschäfte wurden Geladen__________|
    2. [13:21:47] 1
    3. [13:21:47] 2
    4. [13:21:47] 3
    5. [13:21:47] id: 1 | dbid: 1
    6. [13:21:47] 4
    7. [13:21:47] X: 1004.650024 | Y: -936.666992 | Z: 42.328098 | Tankstelle: GS Tanke |
    8. [13:21:47] 1
    9. [13:21:47] 2
    10. [13:21:47] 3
    11. [13:21:47] id: 1 | dbid: 2
    Alles anzeigen

    heißt er kommt bei OnLoadTanke ab dem zweiten durchgang nur bis print 3 ... weil eben die id nicht gleich der dbid ist (außer beim ersten mal) ... Nun ist meine Frage... Wo hab ich nen Denkfehler drinne ?

    //EDIT Neuer Versuch
    //EDIT2 Lösungsweg

    Ich habe nun eine Lösung gefunden...


    Quellcode

    1. //BEARBEITET
    2. stock getBizID(){
    3. for(new i = 0; i < sizeof(bInfo); i++){
    4. return bInfo[i][biz_id];
    5. }
    6. return 0;
    7. }
    8. public OnLoadTanke(){
    9. new rows, //NEU -> id = getBizID()+1;
    10. cache_get_row_count(rows);
    11. if(rows == 0) return 1;
    12. for(new i = 0; i < rows; i++){
    13. print("1");
    14. new dbID, string[256];
    15. print("2");
    16. cache_get_value_name_int(i, "id", dbID);
    17. print("3");
    18. printf("id: %i | dbid: %i", id, dbID);
    19. if(id != dbID) continue;
    20. print("4");
    21. //NEU -> id += 1;
    22. }
    23. return 1;
    24. }
    Alles anzeigen

    MfG
    XonarZ

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von XonarZ ()