PDA

Просмотр полной версии : [Вопрос] Text3D



Pawn.Dima
24.04.2020, 09:10
Здравствуйте сделал шахту но у меня когда обновляется руда на шахте в количестве твориться фиг знает что вот скриншот может кто сталкивался с этим


enum shInfo
{
ruda,//Руда
perepl,//Переплав
metall,//металл
Text3D:dmetall,
Text3D:druda,
Text3D:pereplav
}
new ShahtaInfo[0][shInfo];

Ongamemodeinit

Load3DTextLabel();

конец скрипта


stock Load3DTextLabel()
{
new string[90];
format(string,sizeof(string), "{00ff00}Железная руда\n{ffffff}На складе:\n %d кг", ShahtaInfo[0][ruda]);
ShahtaInfo[0][druda] = Create3DTextLabel(string, COLOR_YELLOW,-1867.4611,-1612.5785,24.0039, 30.0, 0, 0);

format(string,sizeof(string), "{ffffff}Кузница\n{ffa500} %d кг руды\nНа переплавке", ShahtaInfo[0][perepl]);
ShahtaInfo[0][pereplav] = Create3DTextLabel(string, COLOR_YELLOW,-1852.6737,-1612.4672,23.0100, 30.0, 0, 0);

format(string,sizeof(string), "{ffffff}Металл\n{00b0ff}На складе:\n %d кг", ShahtaInfo[0][metall]);
ShahtaInfo[0][dmetall] = Create3DTextLabel(string, COLOR_YELLOW,-1845.5784,-1617.2751,24.0039, 30.0, 0, 0);
return 1;
}


public OnPlayerEnterCheckpoint(playerid)
{
switch(ShahtDeystv[playerid])
{
case 1://Добыча
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
TogglePlayerControllable(playerid, false);
ApplyAnimation(playerid, "BASEBALL", "Bat_4", 4.1, 1, 0, 0, 1, 11000);//Выдали анимацию!
DisablePlayerCheckpoint(playerid);//Удаляем чекпоинт
shahtatime = SetTimerEx("ShahtaDobicha", 1000, false, "i", playerid);//устанавливаем таймер 10 сек
ShahtDeystv[playerid] = 2;//Добыча потом отправляем на склад!
}
case 2://Склад!
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
new string[50];
if(IsPlayerAttachedObjectSlotUsed(playerid, 1)) RemovePlayerAttachedObject(playerid, 1);
if(IsPlayerAttachedObjectSlotUsed(playerid, 2)) RemovePlayerAttachedObject(playerid, 2);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
rands1 = random(sizeof(randommine));
KG[playerid] += randommine[rands1][0];
ShahtaInfo[0][ruda] += randommine[rands1][0];
format(string, sizeof(string), "Общее количество добытой руды %dкг руды", KG[playerid]);
SendClientMessage(playerid, COLOR_YELLOW, string);
format(string, sizeof(string), "Вы добыли %dкг руды", randommine[rands1][0]);
SendClientMessage(playerid, COLOR_BLUE, string);
ShahtDeystv[playerid] = 1;
DisablePlayerCheckpoint(playerid);
switch(random(3))
{
case 0: SetPlayerCheckpoint(playerid, -1805.9828,-1649.1764,24.3256, 6.0);
case 1: SetPlayerCheckpoint(playerid, -1802.4784,-1658.8679,25.5539, 6.0);
case 2: SetPlayerCheckpoint(playerid, -1851.9504,-1649.6320,24.2690, 6.0);
}
UpdateShahta();
SetTimer("FuncsMetall",5000,0);
}
}
return 1;
}


stock UpdateShahta()
{
new string[90];
format(string,sizeof(string), "{00ff00}Железная руда\n{ffffff}На складе:\n %d кг", ShahtaInfo[0][ruda]);
Update3DTextLabelText(ShahtaInfo[0][druda], COLOR_YELLOW, string);

format(string,sizeof(string), "{ffffff}Кузница\n{ffa500} %d кг руды\nНа переплавке", ShahtaInfo[0][perepl]);
Update3DTextLabelText(ShahtaInfo[0][pereplav], COLOR_YELLOW, string);

format(string,sizeof(string), "{ffffff}Металл\n{00b0ff}На складе:\n %d кг", ShahtaInfo[0][metall]);
Update3DTextLabelText(ShahtaInfo[0][dmetall], COLOR_YELLOW, string);
return 1;
}


forward FuncsMetall(playerid);
public FuncsMetall(playerid)
{
if(ShahtaInfo[0][ruda] > 150)
{
ShahtaInfo[0][ruda] -= randommine[rands1][0];
ShahtaInfo[0][perepl] += randommine[rands1][0]/2;
}
return 1;
}
stock UpdateRuda()
{
new end;
if(ShahtaInfo[0][perepl] > 30)
{
end = ShahtaInfo[0][perepl]/2;
ShahtaInfo[0][metall] += end;
ShahtaInfo[0][perepl] -= end*2;
}
return 1;
}

в чем проблема не могу понять может кто сталкивался?

https://s8.hostingkartinok.com/uploads/images/2020/04/4152ff4629defaea59b21aba4514d576.png (https://hostingkartinok.com/show-image.php?id=4152ff4629defaea59b21aba4514d576)


https://s8.hostingkartinok.com/uploads/thumbs/2020/04/4152ff4629defaea59b21aba4514d576.png (https://hostingkartinok.com/show-image.php?id=4152ff4629defaea59b21aba4514d576)

SteveStage
24.04.2020, 10:55
У меня вопрос:


new ShahtaInfo[0][shInfo];

Зачем массиву ShahtaInfo первая мера?

Могу предположить, что в оригинале вместо 0 был playerid, но первый подключенный игрок всегда имеет айди 0.

Pawn.Dima
24.04.2020, 21:51
я делал и просто ruda и т.д и объявлял [MAX_PLAYERS] просто когда я один на сервере все хорошо а когда игрок подключился через хамачи появляется фиг знает что в количестве %d ну на скрине понятно

Daniel_Cortez
25.04.2020, 15:06
У меня вопрос:


new ShahtaInfo[0][shInfo];

Зачем массиву ShahtaInfo первая мера?
Я бы на вашем месте сначала задался другим вопросом: как такое вообще компилируется?)

Но если серьёзно, то да, код для инициализации многомерных массивов забагован до безобразия.

SteveStage
25.04.2020, 15:14
я делал и просто ruda и т.д и объявлял [MAX_PLAYERS] просто когда я один на сервере все хорошо а когда игрок подключился через хамачи появляется фиг знает что в количестве %d ну на скрине понятно

Ну так потому что эта система работает только для тех, у кого id 0, а у второго подключенного игрока id будет 1.

Вот так корректнее:

forward FuncsMetall(playerid);
public FuncsMetall(playerid)
{
if(ShahtaInfo[playerid][ruda] > 150)
{
ShahtaInfo[playerid][ruda] -= randommine[rands1][playerid];
ShahtaInfo[playerid][perepl] += randommine[rands1][playerid]/2;
}
return 1;
}
stock UpdateRuda(playerid)
{
new end;
if(ShahtaInfo[playerid][perepl] > 30)
{
end = ShahtaInfo[playerid][perepl]/2;
ShahtaInfo[playerid][metall] += end;
ShahtaInfo[playerid][perepl] -= end*2;
}
return 1;
}

stock UpdateShahta(playerid)
{
new string[90];
format(string,sizeof(string), "{00ff00}Железная руда\n{ffffff}На складе:\n %d кг", ShahtaInfo[playerid][ruda]);
Update3DTextLabelText(ShahtaInfo[playerid][druda], COLOR_YELLOW, string);

format(string,sizeof(string), "{ffffff}Кузница\n{ffa500} %d кг руды\nНа переплавке", ShahtaInfo[playerid][perepl]);
Update3DTextLabelText(ShahtaInfo[playerid][pereplav], COLOR_YELLOW, string);

format(string,sizeof(string), "{ffffff}Металл\n{00b0ff}На складе:\n %d кг", ShahtaInfo[playerid][metall]);
Update3DTextLabelText(ShahtaInfo[playerid][dmetall], COLOR_YELLOW, string);
return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
switch(ShahtDeystv[playerid])
{
case 1://Добыча
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
TogglePlayerControllable(playerid, false);
ApplyAnimation(playerid, "BASEBALL", "Bat_4", 4.1, 1, 0, 0, 1, 11000);//Выдали анимацию!
DisablePlayerCheckpoint(playerid);//Удаляем чекпоинт
shahtatime = SetTimerEx("ShahtaDobicha", 10000, false, "d", playerid);//устанавливаем таймер 10 сек // SS: 1000 милисекунд - 1 секунда
ShahtDeystv[playerid] = 2;//Добыча потом отправляем на склад!
}
case 2://Склад!
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
new string[50];
if(IsPlayerAttachedObjectSlotUsed(playerid, 1)) RemovePlayerAttachedObject(playerid, 1);
if(IsPlayerAttachedObjectSlotUsed(playerid, 2)) RemovePlayerAttachedObject(playerid, 2);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
rands1 = random(sizeof(randommine));
KG[playerid] += randommine[rands1][playerid];
ShahtaInfo[playerid][ruda] += randommine[rands1][playerid];
format(string, sizeof(string), "Общее количество добытой руды %dкг руды", KG[playerid]);
SendClientMessage(playerid, COLOR_YELLOW, string);
format(string, sizeof(string), "Вы добыли %dкг руды", randommine[rands1][playerid]);
SendClientMessage(playerid, COLOR_BLUE, string);
ShahtDeystv[playerid] = 1;
DisablePlayerCheckpoint(playerid);
switch(random(3))
{
case 0: SetPlayerCheckpoint(playerid, -1805.9828,-1649.1764,24.3256, 6.0);
case 1: SetPlayerCheckpoint(playerid, -1802.4784,-1658.8679,25.5539, 6.0);
case 2: SetPlayerCheckpoint(playerid, -1851.9504,-1649.6320,24.2690, 6.0);
}
UpdateShahta(playerid);
SetTimer("FuncsMetall",5000,false,"d",playerid);
}
}
return 1;
}

stock Load3DTextLabel(playerid)
{
new string[90];
format(string,sizeof(string), "{00ff00}Железная руда\n{ffffff}На складе:\n %d кг", ShahtaInfo[playerid][ruda]);
ShahtaInfo[playerid][druda] = Create3DTextLabel(string, COLOR_YELLOW,-1867.4611,-1612.5785,24.0039, 30.0, 0, 0);

format(string,sizeof(string), "{ffffff}Кузница\n{ffa500} %d кг руды\nНа переплавке", ShahtaInfo[playerid][perepl]);
ShahtaInfo[playerid][pereplav] = Create3DTextLabel(string, COLOR_YELLOW,-1852.6737,-1612.4672,23.0100, 30.0, 0, 0);

format(string,sizeof(string), "{ffffff}Металл\n{00b0ff}На складе:\n %d кг", ShahtaInfo[playerid][metall]);
ShahtaInfo[playerid][dmetall] = Create3DTextLabel(string, COLOR_YELLOW,-1845.5784,-1617.2751,24.0039, 30.0, 0, 0);
return 1;
}

Load3DTextLabel(playerid);

enum shInfo
{
ruda,//Руда
perepl,//Переплав
metall,//металл
Text3D:dmetall,
Text3D:druda,
Text3D:pereplav
}
new ShahtaInfo[MAX_PLAYERS][shInfo];


Я бы на вашем месте сначала задался другим вопросом: как такое вообще компилируется?)

Но если серьёзно, то да, код для инициализации многомерных массивов забагован до безобразия.

Я уже понял, что код безобразный и работает только для игрока с playerid = 0.

По факту в этом коде первая мера [0] просто не нужна, но она задумывалась как playerid игрока, но почему-то и в использовании, и при объявлении она всегда равна нулю. Как можно было не замечать этого?)

И я исправил этот говнокод.

P.S. DC, только сейчас заметил, что код сам по себе баганный и ShahtaInfo имеет 0 ячеек, но все равно хранит число=)

P.P.S. Pawn.Dima, если ты до сих пор ничего не понял, то вот пример баганного говнокода:


new i[0];
i[0] = 5;
printf("%d", i[0]*2);

который можно написать нормально:


new i[MAX_PLAYERS];
i[playerid] = 5;
printf("%d", i[playerid]*2);

Pawn.Dima
25.04.2020, 19:15
Сейчас попробуй спасибо) буду исправляться)

execution
25.04.2020, 19:40
Ну так потому что эта система работает только для тех, у кого id 0, а у второго подключенного игрока id будет 1.

Вот так корректнее:

forward FuncsMetall(playerid);
public FuncsMetall(playerid)
{
if(ShahtaInfo[playerid][ruda] > 150)
{
ShahtaInfo[playerid][ruda] -= randommine[rands1][playerid];
ShahtaInfo[playerid][perepl] += randommine[rands1][playerid]/2;
}
return 1;
}
stock UpdateRuda(playerid)
{
new end;
if(ShahtaInfo[playerid][perepl] > 30)
{
end = ShahtaInfo[playerid][perepl]/2;
ShahtaInfo[playerid][metall] += end;
ShahtaInfo[playerid][perepl] -= end*2;
}
return 1;
}

stock UpdateShahta(playerid)
{
new string[90];
format(string,sizeof(string), "{00ff00}Железная руда\n{ffffff}На складе:\n %d кг", ShahtaInfo[playerid][ruda]);
Update3DTextLabelText(ShahtaInfo[playerid][druda], COLOR_YELLOW, string);

format(string,sizeof(string), "{ffffff}Кузница\n{ffa500} %d кг руды\nНа переплавке", ShahtaInfo[playerid][perepl]);
Update3DTextLabelText(ShahtaInfo[playerid][pereplav], COLOR_YELLOW, string);

format(string,sizeof(string), "{ffffff}Металл\n{00b0ff}На складе:\n %d кг", ShahtaInfo[playerid][metall]);
Update3DTextLabelText(ShahtaInfo[playerid][dmetall], COLOR_YELLOW, string);
return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
switch(ShahtDeystv[playerid])
{
case 1://Добыча
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
TogglePlayerControllable(playerid, false);
ApplyAnimation(playerid, "BASEBALL", "Bat_4", 4.1, 1, 0, 0, 1, 11000);//Выдали анимацию!
DisablePlayerCheckpoint(playerid);//Удаляем чекпоинт
shahtatime = SetTimerEx("ShahtaDobicha", 10000, false, "d", playerid);//устанавливаем таймер 10 сек // SS: 1000 милисекунд - 1 секунда
ShahtDeystv[playerid] = 2;//Добыча потом отправляем на склад!
}
case 2://Склад!
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
new string[50];
if(IsPlayerAttachedObjectSlotUsed(playerid, 1)) RemovePlayerAttachedObject(playerid, 1);
if(IsPlayerAttachedObjectSlotUsed(playerid, 2)) RemovePlayerAttachedObject(playerid, 2);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
rands1 = random(sizeof(randommine));
KG[playerid] += randommine[rands1][playerid];
ShahtaInfo[playerid][ruda] += randommine[rands1][playerid];
format(string, sizeof(string), "Общее количество добытой руды %dкг руды", KG[playerid]);
SendClientMessage(playerid, COLOR_YELLOW, string);
format(string, sizeof(string), "Вы добыли %dкг руды", randommine[rands1][playerid]);
SendClientMessage(playerid, COLOR_BLUE, string);
ShahtDeystv[playerid] = 1;
DisablePlayerCheckpoint(playerid);
switch(random(3))
{
case 0: SetPlayerCheckpoint(playerid, -1805.9828,-1649.1764,24.3256, 6.0);
case 1: SetPlayerCheckpoint(playerid, -1802.4784,-1658.8679,25.5539, 6.0);
case 2: SetPlayerCheckpoint(playerid, -1851.9504,-1649.6320,24.2690, 6.0);
}
UpdateShahta(playerid);
SetTimer("FuncsMetall",5000,false,"d",playerid);
}
}
return 1;
}

stock Load3DTextLabel(playerid)
{
new string[90];
format(string,sizeof(string), "{00ff00}Железная руда\n{ffffff}На складе:\n %d кг", ShahtaInfo[playerid][ruda]);
ShahtaInfo[playerid][druda] = Create3DTextLabel(string, COLOR_YELLOW,-1867.4611,-1612.5785,24.0039, 30.0, 0, 0);

format(string,sizeof(string), "{ffffff}Кузница\n{ffa500} %d кг руды\nНа переплавке", ShahtaInfo[playerid][perepl]);
ShahtaInfo[playerid][pereplav] = Create3DTextLabel(string, COLOR_YELLOW,-1852.6737,-1612.4672,23.0100, 30.0, 0, 0);

format(string,sizeof(string), "{ffffff}Металл\n{00b0ff}На складе:\n %d кг", ShahtaInfo[playerid][metall]);
ShahtaInfo[playerid][dmetall] = Create3DTextLabel(string, COLOR_YELLOW,-1845.5784,-1617.2751,24.0039, 30.0, 0, 0);
return 1;
}

Load3DTextLabel(playerid);

enum shInfo
{
ruda,//Руда
perepl,//Переплав
metall,//металл
Text3D:dmetall,
Text3D:druda,
Text3D:pereplav
}
new ShahtaInfo[MAX_PLAYERS][shInfo];



Я уже понял, что код безобразный и работает только для игрока с playerid = 0.

По факту в этом коде первая мера [0] просто не нужна, но она задумывалась как playerid игрока, но почему-то и в использовании, и при объявлении она всегда равна нулю. Как можно было не замечать этого?)

И я исправил этот говнокод.

P.S. DC, только сейчас заметил, что код сам по себе баганный и ShahtaInfo имеет 0 ячеек, но все равно хранит число=)

P.P.S. Pawn.Dima, если ты до сих пор ничего не понял, то вот пример баганного говнокода:


new i[0];
i[0] = 5;
printf("%d", i[0]*2);

который можно написать нормально:


new i[MAX_PLAYERS];
i[playerid] = 5;
printf("%d", i[playerid]*2);

Нет, это именно номер шахты (0), а не что-либо другое

SteveStage
25.04.2020, 21:12
Нет, это именно номер шахты (0), а не что-либо другое

Круто, в номере шахты 0 ячеек, а как тогда определять, сколько у конкретного игрока руды?

И да, прошу тебя, в своих цитатах удаляй все кроме фразы, которую ты хочешь прокомментировать, иначе смысл просто теряется.

execution
25.04.2020, 23:37
Круто, в номере шахты 0 ячеек, а как тогда определять, сколько у конкретного игрока руды?

И да, прошу тебя, в своих цитатах удаляй все кроме фразы, которую ты хочешь прокомментировать, иначе смысл просто теряется.

public OnPlayerEnterCheckpoint(playerid)
{
switch(ShahtDeystv[playerid])
{
case 1://Добыча
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
TogglePlayerControllable(playerid, false);
ApplyAnimation(playerid, "BASEBALL", "Bat_4", 4.1, 1, 0, 0, 1, 11000);//Выдали анимацию!
DisablePlayerCheckpoint(playerid);//Удаляем чекпоинт
shahtatime = SetTimerEx("ShahtaDobicha", 1000, false, "i", playerid);//устанавливаем таймер 10 сек
ShahtDeystv[playerid] = 2;//Добыча потом отправляем на склад!
}
case 2://Склад!
{
if(IsPlayerInAnyVehicle(playerid))
return 1;
new string[50];
if(IsPlayerAttachedObjectSlotUsed(playerid, 1)) RemovePlayerAttachedObject(playerid, 1);
if(IsPlayerAttachedObjectSlotUsed(playerid, 2)) RemovePlayerAttachedObject(playerid, 2);
if(IsPlayerAttachedObjectSlotUsed(playerid, 3)) RemovePlayerAttachedObject(playerid, 3);
rands1 = random(sizeof(randommine));
KG[playerid] += randommine[rands1][0];
ShahtaInfo[0][ruda] += randommine[rands1][0];
format(string, sizeof(string), "Общее количество добытой руды %dкг руды", KG[playerid]);
SendClientMessage(playerid, COLOR_YELLOW, string);
format(string, sizeof(string), "Вы добыли %dкг руды", randommine[rands1][0]);
SendClientMessage(playerid, COLOR_BLUE, string);
ShahtDeystv[playerid] = 1;
DisablePlayerCheckpoint(playerid);
switch(random(3))
{
case 0: SetPlayerCheckpoint(playerid, -1805.9828,-1649.1764,24.3256, 6.0);
case 1: SetPlayerCheckpoint(playerid, -1802.4784,-1658.8679,25.5539, 6.0);
case 2: SetPlayerCheckpoint(playerid, -1851.9504,-1649.6320,24.2690, 6.0);
}
UpdateShahta();
SetTimer("FuncsMetall",5000,0);
}
}
return 1;
}

Например, здесь?

Pawn.Dima
26.04.2020, 09:12
сделал так как у вас все равно тоже самое(

SteveStage
26.04.2020, 14:35
Например, здесь?

Хорошо, допустим ShahtaInfo - это массив, хранящий инфу о шахте, но тогда почему в этом массиве 0 ячеек?

execution
26.04.2020, 14:48
Хорошо, допустим ShahtaInfo - это массив, хранящий инфу о шахте, но тогда почему в этом массиве 0 ячеек?

Потому, что на сервере 1 шахта и отсчёт начинается с 0?

SteveStage
26.04.2020, 15:38
Потому, что на сервере 1 шахта и отсчёт начинается с 0?

ShahtaInfo[0] - не 1 ячейка под символ 0, а 0 ячеек. Ты понимаешь, что этот массив баганный и не должен иметь ячеек, но это как-то компилируется?

execution
26.04.2020, 17:47
ShahtaInfo[0] - не 1 ячейка под символ 0, а 0 ячеек. Ты понимаешь, что этот массив баганный и не должен иметь ячеек, но это как-то компилируется?

Факт, остаётся фактом.

Daniel_Cortez
26.04.2020, 19:57
Представь, что у тебя на столе лежат 2 яблока: на одном нарисована цифра 0, на другом - 1. Нумерация яблок начинается с нуля, но на столе всё равно два яблока, а не одно. То же самое и в Pawn - в размере массива указывается количество элементов, а не ID последнего элемента.

SteveStage
26.04.2020, 23:34
Представь, что у тебя на столе лежат 2 яблока: на одном нарисована цифра 0, на другом - 1. Нумерация яблок начинается с нуля, но на столе всё равно два яблока, а не одно. То же самое и в Pawn - в размере массива указывается количество элементов, а не ID последнего элемента.

А если привести это сравнение с реальным кодом шахты - то у тебя 0 яблок, но все равно компилятор думает что яблоко одно и компилирует.

Pawn.Dima, просто укажи в первой мере ShahtaInfo количество шахт числом или константой, например MAX_MINES, и пожалуйста, убери этот транслит Shahta, Deystv, pereplav и замени на английские аналоги вроде Mine, Action, remelting.