Просмотр полной версии : [Вопрос] 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.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot