Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 7 из 7
  1. #1
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±

    Логика системы выбора скина при регистрации

    Вот код:

    1. public OnPlayerClickTextDraw(playerid, Text:clickedid)
    2. {
    3. if(clickedid == td_select_skin[1])
    4. {
    5. switch(player[playerid][p_sex])
    6. {
    7. case 1: // male
    8. {
    9. if(number_skin{playerid} == 10)
    10. {
    11. number_skin{playerid} = 1;
    12. SetPlayerSkin(playerid, 3);
    13. return true;
    14. }
    15. else
    16. {
    17. number_skin{playerid}++;
    18. switch(number_skin{playerid})
    19. {
    20. case 1: SetPlayerSkin(playerid, 3);
    21. case 2: SetPlayerSkin(playerid, 7);
    22. case 3: SetPlayerSkin(playerid, 15);
    23. case 4: SetPlayerSkin(playerid, 19);
    24. case 5: SetPlayerSkin(playerid, 22);
    25. case 6: SetPlayerSkin(playerid, 24);
    26. case 7: SetPlayerSkin(playerid, 26);
    27. case 8: SetPlayerSkin(playerid, 30);
    28. case 9: SetPlayerSkin(playerid, 48);
    29. }
    30. }
    31. return true;
    32. }
    33. case 2: // female
    34. {
    35. if(number_skin{playerid} == 19)
    36. {
    37. number_skin{playerid} = 10;
    38. SetPlayerSkin(playerid, 12);
    39. return true;
    40. }
    41. else
    42. {
    43. number_skin{playerid}++;
    44. switch(number_skin{playerid})
    45. {
    46. case 10: SetPlayerSkin(playerid, 12);
    47. case 11: SetPlayerSkin(playerid, 13);
    48. case 12: SetPlayerSkin(playerid, 41);
    49. case 13: SetPlayerSkin(playerid, 55);
    50. case 14: SetPlayerSkin(playerid, 56);
    51. case 15: SetPlayerSkin(playerid, 65);
    52. case 16: SetPlayerSkin(playerid, 91);
    53. case 17: SetPlayerSkin(playerid, 93);
    54. case 18: SetPlayerSkin(playerid, 141);
    55. }
    56. }
    57. return true;
    58. }
    59. }
    60. return true;
    61. }
    62. //
    63. if(clickedid == td_select_skin[0])
    64. {
    65. switch(player[playerid][p_sex])
    66. {
    67. case 1: // male
    68. {
    69. if(number_skin{playerid} == 0)
    70. {
    71. number_skin{playerid} = 9;
    72. SetPlayerSkin(playerid, 48);
    73. return true;
    74. }
    75. else
    76. {
    77. number_skin{playerid}--;
    78. switch(number_skin{playerid})
    79. {
    80. case 1: SetPlayerSkin(playerid, 3);
    81. case 2: SetPlayerSkin(playerid, 7);
    82. case 3: SetPlayerSkin(playerid, 15);
    83. case 4: SetPlayerSkin(playerid, 19);
    84. case 5: SetPlayerSkin(playerid, 22);
    85. case 6: SetPlayerSkin(playerid, 24);
    86. case 7: SetPlayerSkin(playerid, 26);
    87. case 8: SetPlayerSkin(playerid, 30);
    88. case 9: SetPlayerSkin(playerid, 48);
    89. }
    90. }
    91. return true;
    92. }
    93. case 2: // female
    94. {
    95. if(number_skin{playerid} == 9)
    96. {
    97. number_skin{playerid} = 18;
    98. SetPlayerSkin(playerid, 141);
    99. return true;
    100. }
    101. else
    102. {
    103. number_skin{playerid}--;
    104. switch(number_skin{playerid})
    105. {
    106. case 10: SetPlayerSkin(playerid, 12);
    107. case 11: SetPlayerSkin(playerid, 13);
    108. case 12: SetPlayerSkin(playerid, 41);
    109. case 13: SetPlayerSkin(playerid, 55);
    110. case 14: SetPlayerSkin(playerid, 56);
    111. case 15: SetPlayerSkin(playerid, 65);
    112. case 16: SetPlayerSkin(playerid, 91);
    113. case 17: SetPlayerSkin(playerid, 93);
    114. case 18: SetPlayerSkin(playerid, 141);
    115. }
    116. }
    117. return true;
    118. }
    119. }
    120. return true;
    121. }
    122. return true;
    123. }


    1 скин может быть выбран 2 раза, и в определенный момент ты нажимаешь на текстдрав смены скина, но скин не меняется

    В чем может быть проблема?

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Крайне странная реализация системы, если честно...

    Логируй значение number_skin и поймёшь в чём дело.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Логируй значение number_skin и поймёшь в чём дело.
    А что ты предлагаешь? При нажатии на текстдрав вызывается OnPlayerClickTextDraw, и нажатие меняет скин, и number_skin

    Логирование показало, что все нормально

    Код логирования:

    1. public OnPlayerClickTextDraw(playerid, Text:clickedid)
    2. {
    3. if(clickedid == td_select_skin[1])
    4. {
    5. switch(player[playerid][p_sex])
    6. {
    7. case 1: // male
    8. {
    9. if(number_skin{playerid} == 10)
    10. {
    11. number_skin{playerid} = 1;
    12. SetPlayerSkin(playerid, 3);
    13. return true;
    14. }
    15. else
    16. {
    17. number_skin{playerid}++;
    18. switch(number_skin{playerid})
    19. {
    20. case 1: SetPlayerSkin(playerid, 3);
    21. case 2: SetPlayerSkin(playerid, 7);
    22. case 3: SetPlayerSkin(playerid, 15);
    23. case 4: SetPlayerSkin(playerid, 19);
    24. case 5: SetPlayerSkin(playerid, 22);
    25. case 6: SetPlayerSkin(playerid, 24);
    26. case 7: SetPlayerSkin(playerid, 26);
    27. case 8: SetPlayerSkin(playerid, 30);
    28. case 9: SetPlayerSkin(playerid, 48);
    29. }
    30. }
    31. printf("skin - %d", number_skin{playerid});
    32. return true;
    33. }
    34. case 2: // female
    35. {
    36. if(number_skin{playerid} == 19)
    37. {
    38. number_skin{playerid} = 10;
    39. SetPlayerSkin(playerid, 12);
    40. return true;
    41. }
    42. else
    43. {
    44. number_skin{playerid}++;
    45. switch(number_skin{playerid})
    46. {
    47. case 10: SetPlayerSkin(playerid, 12);
    48. case 11: SetPlayerSkin(playerid, 13);
    49. case 12: SetPlayerSkin(playerid, 41);
    50. case 13: SetPlayerSkin(playerid, 55);
    51. case 14: SetPlayerSkin(playerid, 56);
    52. case 15: SetPlayerSkin(playerid, 65);
    53. case 16: SetPlayerSkin(playerid, 91);
    54. case 17: SetPlayerSkin(playerid, 93);
    55. case 18: SetPlayerSkin(playerid, 141);
    56. }
    57. }
    58. printf("skin - %d", number_skin{playerid});
    59. return true;
    60. }
    61. }
    62. return true;
    63. }
    64. //
    65. if(clickedid == td_select_skin[0])
    66. {
    67. switch(player[playerid][p_sex])
    68. {
    69. case 1: // male
    70. {
    71. if(number_skin{playerid} == 0)
    72. {
    73. number_skin{playerid} = 9;
    74. SetPlayerSkin(playerid, 48);
    75. return true;
    76. }
    77. else
    78. {
    79. number_skin{playerid}--;
    80. switch(number_skin{playerid})
    81. {
    82. case 1: SetPlayerSkin(playerid, 3);
    83. case 2: SetPlayerSkin(playerid, 7);
    84. case 3: SetPlayerSkin(playerid, 15);
    85. case 4: SetPlayerSkin(playerid, 19);
    86. case 5: SetPlayerSkin(playerid, 22);
    87. case 6: SetPlayerSkin(playerid, 24);
    88. case 7: SetPlayerSkin(playerid, 26);
    89. case 8: SetPlayerSkin(playerid, 30);
    90. case 9: SetPlayerSkin(playerid, 48);
    91. }
    92. }
    93. printf("skin - %d", number_skin{playerid});
    94. return true;
    95. }
    96. case 2: // female
    97. {
    98. if(number_skin{playerid} == 9)
    99. {
    100. number_skin{playerid} = 18;
    101. SetPlayerSkin(playerid, 141);
    102. return true;
    103. }
    104. else
    105. {
    106. number_skin{playerid}--;
    107. switch(number_skin{playerid})
    108. {
    109. case 10: SetPlayerSkin(playerid, 12);
    110. case 11: SetPlayerSkin(playerid, 13);
    111. case 12: SetPlayerSkin(playerid, 41);
    112. case 13: SetPlayerSkin(playerid, 55);
    113. case 14: SetPlayerSkin(playerid, 56);
    114. case 15: SetPlayerSkin(playerid, 65);
    115. case 16: SetPlayerSkin(playerid, 91);
    116. case 17: SetPlayerSkin(playerid, 93);
    117. case 18: SetPlayerSkin(playerid, 141);
    118. }
    119. }
    120. printf("skin - %d", number_skin{playerid});
    121. return true;
    122. }
    123. }
    124. return true;
    125. }
    126. return true;
    127. }


    Результат логирования:

    Код:
    ----------
    Loaded log file: "server_log.txt".
    ----------
    
    SA-MP Dedicated Server
    ----------------------
    v0.3.7-R2, (C)2005-2015 SA-MP Team
    
    [16:03:53] 
    [16:03:53] Server Plugins
    [16:03:53] --------------
    [16:03:53]  Loading plugin: crashdetect
    [16:03:53]   CrashDetect plugin 4.19.4
    [16:03:53]   Loaded.
    [16:03:53]  Loading plugin: mysql
    [16:03:53]  >> plugin.mysql: R39-2 successfully loaded.
    [16:03:53]   Loaded.
    [16:03:53]  Loading plugin: pawncmd
    [16:03:53] Pawn.CMD plugin v3.1.4 by urShadow loaded
    [16:03:53]   Loaded.
    [16:03:53]  Loading plugin: sscanf
    [16:03:53] 
    
    [16:03:53]  ===============================
    
    [16:03:53]       sscanf plugin loaded.     
    
    [16:03:53]          Version:  2.8.2        
    
    [16:03:53]    (c) 2012 Alex "Y_Less" Cole  
    
    [16:03:53]  ===============================
    
    [16:03:53]   Loaded.
    [16:03:53]  Loading plugin: streamer
    [16:03:53] 
    
    *** Streamer Plugin v2.9.1 by Incognito loaded ***
    
    [16:03:53]   Loaded.
    [16:03:53]  Loading plugin: iTD
    [16:03:53] 
    * iTD Plugin loaded. (Support for textdraw editor mouse/keyboard)
    
    [16:03:53]   Loaded.
    [16:03:53]  Loaded 6 plugins.
    
    [16:03:53] 
    [16:03:53] Filterscripts
    [16:03:53] ---------------
    [16:03:53]   Loading filterscript 'iTD.amx'...
    [16:03:53] 
    	iPLEOMAX's TextDraw Editor loaded successfully!
    	Version: 1.16 Stable (13/10/2012)
    
    [16:03:53]   Loaded 1 filterscripts.
    
    [16:03:53] [------------------------------------]
    [16:03:53] [-----Mode by Steve_Stage------------]
    [16:03:53] [-----VK: vk.com/steve_stage---------]
    [16:03:53] [------------------------------------]
    [16:03:53] Number of vehicle models: 0
    [16:04:07] [connection] incoming connection: 127.0.0.1:50642 id: 0
    [16:04:07] [join] Steve_Stag has joined the server (0:127.0.0.1)
    [16:04:17] skin - 0
    [16:04:18] skin - 8
    [16:04:19] skin - 7
    [16:04:19] skin - 6
    [16:04:19] skin - 5
    [16:04:20] skin - 4
    [16:04:20] skin - 3
    [16:04:21] skin - 2
    [16:04:21] skin - 1
    [16:04:21] skin - 0
    [16:04:23] skin - 8
    [16:04:24] [part] Steve_Stag has left the server (0:1)
    UPD: Все, исправил, просто засунул все в switch, работает безупречно

    Вот пофикшенная версия:

    1. public OnPlayerClickTextDraw(playerid, Text:clickedid)
    2. {
    3. if(clickedid == td_select_skin[1])
    4. {
    5. switch(player[playerid][p_sex])
    6. {
    7. case 1: // male
    8. {
    9. number_skin{playerid}++;
    10. switch(number_skin{playerid})
    11. {
    12. case 1: SetPlayerSkin(playerid, 3);
    13. case 2: SetPlayerSkin(playerid, 7);
    14. case 3: SetPlayerSkin(playerid, 15);
    15. case 4: SetPlayerSkin(playerid, 19);
    16. case 5: SetPlayerSkin(playerid, 22);
    17. case 6: SetPlayerSkin(playerid, 24);
    18. case 7: SetPlayerSkin(playerid, 26);
    19. case 8: SetPlayerSkin(playerid, 30);
    20. case 9: SetPlayerSkin(playerid, 48);
    21. case 10:
    22. {
    23. number_skin{playerid} = 1;
    24. SetPlayerSkin(playerid, 3);
    25. }
    26. }
    27. printf("skin - %d", number_skin{playerid});
    28. return true;
    29. }
    30. case 2: // female
    31. {
    32. number_skin{playerid}++;
    33. switch(number_skin{playerid})
    34. {
    35. case 10: SetPlayerSkin(playerid, 12);
    36. case 11: SetPlayerSkin(playerid, 13);
    37. case 12: SetPlayerSkin(playerid, 41);
    38. case 13: SetPlayerSkin(playerid, 55);
    39. case 14: SetPlayerSkin(playerid, 56);
    40. case 15: SetPlayerSkin(playerid, 65);
    41. case 16: SetPlayerSkin(playerid, 91);
    42. case 17: SetPlayerSkin(playerid, 93);
    43. case 18: SetPlayerSkin(playerid, 141);
    44. case 19:
    45. {
    46. number_skin{playerid} = 10;
    47. SetPlayerSkin(playerid, 12);
    48. }
    49. }
    50. printf("skin - %d", number_skin{playerid});
    51. return true;
    52. }
    53. }
    54. return true;
    55. }
    56. //
    57. if(clickedid == td_select_skin[0])
    58. {
    59. switch(player[playerid][p_sex])
    60. {
    61. case 1: // male
    62. {
    63. number_skin{playerid}--;
    64. switch(number_skin{playerid})
    65. {
    66. case 0:
    67. {
    68. number_skin{playerid} = 9;
    69. SetPlayerSkin(playerid, 48);
    70. }
    71. case 1: SetPlayerSkin(playerid, 3);
    72. case 2: SetPlayerSkin(playerid, 7);
    73. case 3: SetPlayerSkin(playerid, 15);
    74. case 4: SetPlayerSkin(playerid, 19);
    75. case 5: SetPlayerSkin(playerid, 22);
    76. case 6: SetPlayerSkin(playerid, 24);
    77. case 7: SetPlayerSkin(playerid, 26);
    78. case 8: SetPlayerSkin(playerid, 30);
    79. case 9: SetPlayerSkin(playerid, 48);
    80. }
    81. printf("skin - %d", number_skin{playerid});
    82. return true;
    83. }
    84. case 2: // female
    85. {
    86. number_skin{playerid}--;
    87. switch(number_skin{playerid})
    88. {
    89. case 0:
    90. {
    91. number_skin{playerid} = 18;
    92. SetPlayerSkin(playerid, 141);
    93. }
    94. case 10: SetPlayerSkin(playerid, 12);
    95. case 11: SetPlayerSkin(playerid, 13);
    96. case 12: SetPlayerSkin(playerid, 41);
    97. case 13: SetPlayerSkin(playerid, 55);
    98. case 14: SetPlayerSkin(playerid, 56);
    99. case 15: SetPlayerSkin(playerid, 65);
    100. case 16: SetPlayerSkin(playerid, 91);
    101. case 17: SetPlayerSkin(playerid, 93);
    102. case 18: SetPlayerSkin(playerid, 141);
    103. }
    104. printf("skin - %d", number_skin{playerid});
    105. return true;
    106. }
    107. }
    108. return true;
    109. }
    110. return true;
    111. }


    Для того, чтобы убрать логирование - уберите из паблика все printf (ваш Кэп)

    Вопрос решен, тему можно закрывать
    Последний раз редактировалось SteveStage; 08.12.2019 в 18:29.

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1. new SkinsMale[] = {3, 7, 15, 19, 22, 24, 26, 30, 48};
    2. new SkinsFemale[] = {12, 13, 41, 55, 56, 65, 91, 93, 141};
    3. new pVar__SelectSkin_IDX[] = "pVar__SelectSkin_IDX";
    4.  
    5.  
    6. if(clickedid == td_select_skin[1])
    7. {
    8. new idx = GetPVarInt(playerid, pVar__SelectSkin_IDX)+1;
    9. if(player[playerid][p_sex] == 1)
    10. {
    11. if(idx >= sizeof(SkinsMale))
    12. idx = 0;
    13. SetPlayerSkin(playerid, SkinsMale[idx]);
    14. }
    15. else
    16. {
    17. if(idx >= sizeof(SkinsFemale))
    18. idx = 0;
    19. SetPlayerSkin(playerid, SkinsFemale[idx]);
    20. }
    21. SetPVarInt(playerid, pVar__SelectSkin_IDX, idx);
    22. return 1;
    23. }
    24. else if(clickedid == td_select_skin[0])
    25. {
    26. new idx = GetPVarInt(playerid, pVar__SelectSkin_IDX)-1;
    27. if(player[playerid][p_sex] == 1)
    28. {
    29. if(idx < 0)
    30. idx = sizeof(SkinsMale)-1;
    31. SetPlayerSkin(playerid, SkinsMale[idx]);
    32. }
    33. else
    34. {
    35. if(idx < 0)
    36. idx = sizeof(SkinsFemale)-1;
    37. SetPlayerSkin(playerid, SkinsFemale[idx]);
    38. }
    39. SetPVarInt(playerid, pVar__SelectSkin_IDX, idx);
    40. return 1;
    41. }
    42.  
    43. // При подтверждении выбора
    44. DeletePVar(playerid, pVar__SelectSkin_IDX);
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #5
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    1. new pVar__SelectSkin_IDX[] = "pVar__SelectSkin_IDX";
    Только не совсем понятно, зачем использовать массив, можно же просто использовать переменную и приравнять ее к нулю
    Последний раз редактировалось SteveStage; 08.12.2019 в 19:43.

  6. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Только не совсем понятно, зачем использовать массив, можно же просто использовать переменную и приравнять ее к нулю
    Массив используется чтоб имя pVar не дублировалось в памяти сервера + чтоб исключить возможность опечатки при написании этого самого имени.

    pVar используется, ибо код не будет вызываться часто и посему использование pVar будет оправдано: и памяти лишней не выделится, и код будет проще, так как pVar удаляется при выходе и при входе он всегда равен 0 (то есть, не придётся вручную обнулять и контролировать это). Можно массивы переместить прямо в OnPlayerClickTextDraw, создав их не через оператор "new", а через оператор "static", и тогда вообще вся система будет умещаться в одном паблике.
    Но можно и через массив сделать. Опять же: код вызывается не часто, поэтому разница по скорости будет не существенна.
    Последний раз редактировалось DeimoS; 08.12.2019 в 19:48.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #7
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Можно массивы переместить прямо в OnPlayerClickTextDraw, создав их не через оператор "new", а через оператор "static", и тогда вообще вся система будет умещаться в одном паблике.
    Спасибо, все работает как по маслу

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •