PDA

Просмотр полной версии : [Вопрос] Логика системы выбора скина при регистрации



SteveStage
08.12.2019, 14:49
Вот код:

public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
if(clickedid == td_select_skin[1])
{
switch(player[playerid][p_sex])
{
case 1: // male
{
if(number_skin{playerid} == 10)
{
number_skin{playerid} = 1;
SetPlayerSkin(playerid, 3);
return true;
}
else
{
number_skin{playerid}++;
switch(number_skin{playerid})
{
case 1: SetPlayerSkin(playerid, 3);
case 2: SetPlayerSkin(playerid, 7);
case 3: SetPlayerSkin(playerid, 15);
case 4: SetPlayerSkin(playerid, 19);
case 5: SetPlayerSkin(playerid, 22);
case 6: SetPlayerSkin(playerid, 24);
case 7: SetPlayerSkin(playerid, 26);
case 8: SetPlayerSkin(playerid, 30);
case 9: SetPlayerSkin(playerid, 48);
}
}
return true;
}
case 2: // female
{
if(number_skin{playerid} == 19)
{
number_skin{playerid} = 10;
SetPlayerSkin(playerid, 12);
return true;
}
else
{
number_skin{playerid}++;
switch(number_skin{playerid})
{
case 10: SetPlayerSkin(playerid, 12);
case 11: SetPlayerSkin(playerid, 13);
case 12: SetPlayerSkin(playerid, 41);
case 13: SetPlayerSkin(playerid, 55);
case 14: SetPlayerSkin(playerid, 56);
case 15: SetPlayerSkin(playerid, 65);
case 16: SetPlayerSkin(playerid, 91);
case 17: SetPlayerSkin(playerid, 93);
case 18: SetPlayerSkin(playerid, 141);
}
}
return true;
}
}
return true;
}
//
if(clickedid == td_select_skin[0])
{
switch(player[playerid][p_sex])
{
case 1: // male
{
if(number_skin{playerid} == 0)
{
number_skin{playerid} = 9;
SetPlayerSkin(playerid, 48);
return true;
}
else
{
number_skin{playerid}--;
switch(number_skin{playerid})
{
case 1: SetPlayerSkin(playerid, 3);
case 2: SetPlayerSkin(playerid, 7);
case 3: SetPlayerSkin(playerid, 15);
case 4: SetPlayerSkin(playerid, 19);
case 5: SetPlayerSkin(playerid, 22);
case 6: SetPlayerSkin(playerid, 24);
case 7: SetPlayerSkin(playerid, 26);
case 8: SetPlayerSkin(playerid, 30);
case 9: SetPlayerSkin(playerid, 48);
}
}
return true;
}
case 2: // female
{
if(number_skin{playerid} == 9)
{
number_skin{playerid} = 18;
SetPlayerSkin(playerid, 141);
return true;
}
else
{
number_skin{playerid}--;
switch(number_skin{playerid})
{
case 10: SetPlayerSkin(playerid, 12);
case 11: SetPlayerSkin(playerid, 13);
case 12: SetPlayerSkin(playerid, 41);
case 13: SetPlayerSkin(playerid, 55);
case 14: SetPlayerSkin(playerid, 56);
case 15: SetPlayerSkin(playerid, 65);
case 16: SetPlayerSkin(playerid, 91);
case 17: SetPlayerSkin(playerid, 93);
case 18: SetPlayerSkin(playerid, 141);
}
}
return true;
}
}
return true;
}
return true;
}

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

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

DeimoS
08.12.2019, 16:46
Крайне странная реализация системы, если честно...

Логируй значение number_skin и поймёшь в чём дело.

SteveStage
08.12.2019, 17:02
Логируй значение number_skin и поймёшь в чём дело.

А что ты предлагаешь? При нажатии на текстдрав вызывается OnPlayerClickTextDraw, и нажатие меняет скин, и number_skin

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

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

public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
if(clickedid == td_select_skin[1])
{
switch(player[playerid][p_sex])
{
case 1: // male
{
if(number_skin{playerid} == 10)
{
number_skin{playerid} = 1;
SetPlayerSkin(playerid, 3);
return true;
}
else
{
number_skin{playerid}++;
switch(number_skin{playerid})
{
case 1: SetPlayerSkin(playerid, 3);
case 2: SetPlayerSkin(playerid, 7);
case 3: SetPlayerSkin(playerid, 15);
case 4: SetPlayerSkin(playerid, 19);
case 5: SetPlayerSkin(playerid, 22);
case 6: SetPlayerSkin(playerid, 24);
case 7: SetPlayerSkin(playerid, 26);
case 8: SetPlayerSkin(playerid, 30);
case 9: SetPlayerSkin(playerid, 48);
}
}
printf("skin - %d", number_skin{playerid});
return true;
}
case 2: // female
{
if(number_skin{playerid} == 19)
{
number_skin{playerid} = 10;
SetPlayerSkin(playerid, 12);
return true;
}
else
{
number_skin{playerid}++;
switch(number_skin{playerid})
{
case 10: SetPlayerSkin(playerid, 12);
case 11: SetPlayerSkin(playerid, 13);
case 12: SetPlayerSkin(playerid, 41);
case 13: SetPlayerSkin(playerid, 55);
case 14: SetPlayerSkin(playerid, 56);
case 15: SetPlayerSkin(playerid, 65);
case 16: SetPlayerSkin(playerid, 91);
case 17: SetPlayerSkin(playerid, 93);
case 18: SetPlayerSkin(playerid, 141);
}
}
printf("skin - %d", number_skin{playerid});
return true;
}
}
return true;
}
//
if(clickedid == td_select_skin[0])
{
switch(player[playerid][p_sex])
{
case 1: // male
{
if(number_skin{playerid} == 0)
{
number_skin{playerid} = 9;
SetPlayerSkin(playerid, 48);
return true;
}
else
{
number_skin{playerid}--;
switch(number_skin{playerid})
{
case 1: SetPlayerSkin(playerid, 3);
case 2: SetPlayerSkin(playerid, 7);
case 3: SetPlayerSkin(playerid, 15);
case 4: SetPlayerSkin(playerid, 19);
case 5: SetPlayerSkin(playerid, 22);
case 6: SetPlayerSkin(playerid, 24);
case 7: SetPlayerSkin(playerid, 26);
case 8: SetPlayerSkin(playerid, 30);
case 9: SetPlayerSkin(playerid, 48);
}
}
printf("skin - %d", number_skin{playerid});
return true;
}
case 2: // female
{
if(number_skin{playerid} == 9)
{
number_skin{playerid} = 18;
SetPlayerSkin(playerid, 141);
return true;
}
else
{
number_skin{playerid}--;
switch(number_skin{playerid})
{
case 10: SetPlayerSkin(playerid, 12);
case 11: SetPlayerSkin(playerid, 13);
case 12: SetPlayerSkin(playerid, 41);
case 13: SetPlayerSkin(playerid, 55);
case 14: SetPlayerSkin(playerid, 56);
case 15: SetPlayerSkin(playerid, 65);
case 16: SetPlayerSkin(playerid, 91);
case 17: SetPlayerSkin(playerid, 93);
case 18: SetPlayerSkin(playerid, 141);
}
}
printf("skin - %d", number_skin{playerid});
return true;
}
}
return true;
}
return true;
}

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


----------
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, работает безупречно

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

public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
if(clickedid == td_select_skin[1])
{
switch(player[playerid][p_sex])
{
case 1: // male
{
number_skin{playerid}++;
switch(number_skin{playerid})
{
case 1: SetPlayerSkin(playerid, 3);
case 2: SetPlayerSkin(playerid, 7);
case 3: SetPlayerSkin(playerid, 15);
case 4: SetPlayerSkin(playerid, 19);
case 5: SetPlayerSkin(playerid, 22);
case 6: SetPlayerSkin(playerid, 24);
case 7: SetPlayerSkin(playerid, 26);
case 8: SetPlayerSkin(playerid, 30);
case 9: SetPlayerSkin(playerid, 48);
case 10:
{
number_skin{playerid} = 1;
SetPlayerSkin(playerid, 3);
}
}
printf("skin - %d", number_skin{playerid});
return true;
}
case 2: // female
{
number_skin{playerid}++;
switch(number_skin{playerid})
{
case 10: SetPlayerSkin(playerid, 12);
case 11: SetPlayerSkin(playerid, 13);
case 12: SetPlayerSkin(playerid, 41);
case 13: SetPlayerSkin(playerid, 55);
case 14: SetPlayerSkin(playerid, 56);
case 15: SetPlayerSkin(playerid, 65);
case 16: SetPlayerSkin(playerid, 91);
case 17: SetPlayerSkin(playerid, 93);
case 18: SetPlayerSkin(playerid, 141);
case 19:
{
number_skin{playerid} = 10;
SetPlayerSkin(playerid, 12);
}
}
printf("skin - %d", number_skin{playerid});
return true;
}
}
return true;
}
//
if(clickedid == td_select_skin[0])
{
switch(player[playerid][p_sex])
{
case 1: // male
{
number_skin{playerid}--;
switch(number_skin{playerid})
{
case 0:
{
number_skin{playerid} = 9;
SetPlayerSkin(playerid, 48);
}
case 1: SetPlayerSkin(playerid, 3);
case 2: SetPlayerSkin(playerid, 7);
case 3: SetPlayerSkin(playerid, 15);
case 4: SetPlayerSkin(playerid, 19);
case 5: SetPlayerSkin(playerid, 22);
case 6: SetPlayerSkin(playerid, 24);
case 7: SetPlayerSkin(playerid, 26);
case 8: SetPlayerSkin(playerid, 30);
case 9: SetPlayerSkin(playerid, 48);
}
printf("skin - %d", number_skin{playerid});
return true;
}
case 2: // female
{
number_skin{playerid}--;
switch(number_skin{playerid})
{
case 0:
{
number_skin{playerid} = 18;
SetPlayerSkin(playerid, 141);
}
case 10: SetPlayerSkin(playerid, 12);
case 11: SetPlayerSkin(playerid, 13);
case 12: SetPlayerSkin(playerid, 41);
case 13: SetPlayerSkin(playerid, 55);
case 14: SetPlayerSkin(playerid, 56);
case 15: SetPlayerSkin(playerid, 65);
case 16: SetPlayerSkin(playerid, 91);
case 17: SetPlayerSkin(playerid, 93);
case 18: SetPlayerSkin(playerid, 141);
}
printf("skin - %d", number_skin{playerid});
return true;
}
}
return true;
}
return true;
}

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

Вопрос решен, тему можно закрывать

DeimoS
08.12.2019, 19:15
new SkinsMale[] = {3, 7, 15, 19, 22, 24, 26, 30, 48};
new SkinsFemale[] = {12, 13, 41, 55, 56, 65, 91, 93, 141};
new pVar__SelectSkin_IDX[] = "pVar__SelectSkin_IDX";


if(clickedid == td_select_skin[1])
{
new idx = GetPVarInt(playerid, pVar__SelectSkin_IDX)+1;
if(player[playerid][p_sex] == 1)
{
if(idx >= sizeof(SkinsMale))
idx = 0;
SetPlayerSkin(playerid, SkinsMale[idx]);
}
else
{
if(idx >= sizeof(SkinsFemale))
idx = 0;
SetPlayerSkin(playerid, SkinsFemale[idx]);
}
SetPVarInt(playerid, pVar__SelectSkin_IDX, idx);
return 1;
}
else if(clickedid == td_select_skin[0])
{
new idx = GetPVarInt(playerid, pVar__SelectSkin_IDX)-1;
if(player[playerid][p_sex] == 1)
{
if(idx < 0)
idx = sizeof(SkinsMale)-1;
SetPlayerSkin(playerid, SkinsMale[idx]);
}
else
{
if(idx < 0)
idx = sizeof(SkinsFemale)-1;
SetPlayerSkin(playerid, SkinsFemale[idx]);
}
SetPVarInt(playerid, pVar__SelectSkin_IDX, idx);
return 1;
}

// При подтверждении выбора
DeletePVar(playerid, pVar__SelectSkin_IDX);

SteveStage
08.12.2019, 19:41
new pVar__SelectSkin_IDX[] = "pVar__SelectSkin_IDX";

Только не совсем понятно, зачем использовать массив, можно же просто использовать переменную и приравнять ее к нулю

DeimoS
08.12.2019, 19:46
Только не совсем понятно, зачем использовать массив, можно же просто использовать переменную и приравнять ее к нулю

Массив используется чтоб имя pVar не дублировалось в памяти сервера + чтоб исключить возможность опечатки при написании этого самого имени.

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

SteveStage
08.12.2019, 20:17
Можно массивы переместить прямо в OnPlayerClickTextDraw, создав их не через оператор "new", а через оператор "static", и тогда вообще вся система будет умещаться в одном паблике.

Спасибо, все работает как по маслу