Перейти к содержанию

Баг с instance_enter


Рекомендуемые сообщения

В общем, проблема такая.

Кусок кода:


instance_enter("Hell of Bossnia", 131, 118);
sleep 300;
warpparty "bossnia_01", 131,118,.PartyID;

instance_db:


13,Hell of Bossnia,1200,bossnia_01,131,118,bossnia_01

Тот, кто первый варпается через instance_enter попадает в alb_ship (так пишет когда нажимаешь alt+z)

Хотя находится он на локации bossnia_01. Но никого не видит. И его не видно.

Есть идеи, что это? И как пофиксить?

Если использовать без Instance_enter, тогда все нормально. Но в табличке инстансов пишет что он будет удален, если не войти через 5 минут.

rAthena 17719

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты

В ../src/map/instance.c функция instance_mapname2mapid переписывает название карты в вид ("%d#%s", instance_id, iname) - в вашем случае "13#bossnia_01" так как не может найти символ @ в названии карты. В следствии чего, функция pc_setpos не может найти mapindex карты 13#bossnia_01 и отсылает вас на 1 в списке, а это у нас alb_ship :)

Либо создаем копии карт bossnia_01 вида 1@bossnia_01, либо 13#bossnia_01, либо меняем эту строку :


snprintf(alt_name, sizeof(alt_name),"%d#%s", instance_id, iname);

на


snprintf(alt_name, sizeof(alt_name),"%s", iname);

Изменено пользователем Nurkz
  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты


instance.c: In function 'instance_mapname2mapid':
instance.c:389:5: warning: format '%s' expects argument of type 'char *', but argument 4 has type 'int' [-Wformat]
instance.c:389:5: warning: too many arguments for format [-Wformat-extra-args]
instance.c:389:5: warning: format '%s' expects argument of type 'char *', but argument 4 has type 'int' [-Wformat]
instance.c:389:5: warning: too many arguments for format [-Wformat-extra-args]

Не нравится компилятору мои изменения :) В принципе понимаю что это. Меня больше интересуют другие ворнинги.

Чтоб не создавать тему:


skill.c: In function 'skill_unitsetting':
skill.c:12079:18: warning: array subscript is above array bounds [-Warray-bounds]

Вот кусок кода, который там:


{
struct skill_condition req = skill_get_requirement(sd,skill_id,skill_lv);
ARR_FIND(0, MAX_SKILL_ITEM_REQUIRE, i, req.itemid[i] && (req.itemid[i] == ITEMID_TRAP || req.itemid[i] == ITEMID_TRAP_ALLOY));
[b][12079] >> на это ругается[/b] if( req.itemid[i] )
req_item = req.itemid[i];
if( map_flag_gvg(src->m) || map[src->m].flag.battleground )
limit *= 4; // longer trap times in WOE [celest]
if( battle_config.vs_traps_bctall && map_flag_vs(src->m) && (src->type&battle_config.vs_traps_bctall) )
target = BCT_ALL;
}

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты


instance.c: In function 'instance_mapname2mapid':
instance.c:389:5: warning: format '%s' expects argument of type 'char *', but argument 4 has type 'int' [-Wformat]
instance.c:389:5: warning: too many arguments for format [-Wformat-extra-args]
instance.c:389:5: warning: format '%s' expects argument of type 'char *', but argument 4 has type 'int' [-Wformat]
instance.c:389:5: warning: too many arguments for format [-Wformat-extra-args]

Не нравится компилятору мои изменения :) В принципе понимаю что это. Меня больше интересуют другие ворнинги.

Чтоб не создавать тему:


skill.c: In function 'skill_unitsetting':
skill.c:12079:18: warning: array subscript is above array bounds [-Warray-bounds]

Вот кусок кода, который там:


{
struct skill_condition req = skill_get_requirement(sd,skill_id,skill_lv);
ARR_FIND(0, MAX_SKILL_ITEM_REQUIRE, i, req.itemid[i] && (req.itemid[i] == ITEMID_TRAP || req.itemid[i] == ITEMID_TRAP_ALLOY));
[b][12079] >> на это ругается[/b] if( req.itemid[i] )
req_item = req.itemid[i];
if( map_flag_gvg(src->m) || map[src->m].flag.battleground )
limit *= 4; // longer trap times in WOE [celest]
if( battle_config.vs_traps_bctall && map_flag_vs(src->m) && (src->type&battle_config.vs_traps_bctall) )
target = BCT_ALL;
}

насчет instance_mapname2mapid, убери instance_id в передаваемых значениях на строку :

snprintf(alt_name, sizeof(alt_name),"%s", instance_id, iname);

насчет skill.c

у тебя i может вылезти за рамки максимального значения массива


if( i < MAX_SKILL_ITEM_REQUIRE && req.itemid[i] )
req_item = req.itemid[i];

Поменял карту с bossnia_01 на 1@uns. Проблема осталась ):

В db/map_index.txt и conf/maps_athena.conf добавил? Mapcache пересобирал?

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

1@uns = стандартная локация

А насчет instance_mapname2mapid сейчас проверю, отпишу

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты

В общем, все равно варпает в альберту )

Мой скрипт для проверки:


prontera,141,196,6 script check 100,{
if (getcharid(1)) {
instance_create("Dragon Nest");
getpartymember(getcharid(1),2);
set .@partymembercount, $@partymembercount;
copyarray .@partymemberaid[0], $@partymemberaid[0], .@partymembercount;
for (set .@i, 0; .@i < .@partymembercount; set .@i, .@i + 1) {
// Attach party member
if (attachrid(.@partymemberaid[.@i])) {
// Check if player is logged in, not vending or chatting (AFK)
if (isloggedin(getcharid(3),getcharid(0)) && !checkvending() && !checkchatting() && strcharinfo(3) == strcharinfo(3)) {
// Enter instance
.@enter = instance_enter("Dragon Nest");
if (.@enter != 0) {
mes "["+strnpcinfo(1)+"]";
switch (.@enter) {
case 1: mes "ERROR: Party not found."; break;
case 2: mes "ERROR: Party does not have an instance."; break;
case 3: mes "ERROR: Unknown error."; break;
}
mes " ";
mes "Instance entry ^FF0000failed^000000.";
emotion e_omg;
close;
}
}
}
}
}
}

http://rghost.ru/8fvxJGtPJ.view

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты

Как вариант :


int instance_mapname2mapid(const char *name, short instance_id)
{
struct instance_data *im;
int m = map_mapname2mapid(name);
char iname[MAP_NAME_LENGTH];
int i;

if(m < 0) {
ShowError("instance_mapname2mapid: map name %s does not exist.\n",name);
return -1;
}

strcpy(iname,name);

if(instance_id <= 0 || instance_id > MAX_INSTANCE_DATA)
return -1;

im = &instance_data[instance_id];
if(im->state != INSTANCE_BUSY)
return -1;

for(i = 0; i < MAX_MAP_PER_INSTANCE; i++) {
if(im->map[i].src_m == m) {
return map_mapname2mapid(iname);
}
}
return -1;
}

Попробуй.. Я вообще офигел от того, что они там наворотили с этими инстансами..

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

Как вариант :


int instance_mapname2mapid(const char *name, short instance_id)
{
struct instance_data *im;
int m = map_mapname2mapid(name);
char iname[MAP_NAME_LENGTH];
int i;

if(m < 0) {
ShowError("instance_mapname2mapid: map name %s does not exist.\n",name);
return -1;
}

strcpy(iname,name);

if(instance_id <= 0 || instance_id > MAX_INSTANCE_DATA)
return -1;

im = &instance_data[instance_id];
if(im->state != INSTANCE_BUSY)
return -1;

for(i = 0; i < MAX_MAP_PER_INSTANCE; i++) {
if(im->map[i].src_m == m) {
return map_mapname2mapid(iname);
}
}
return -1;
}

Попробуй.. Я вообще офигел от того, что они там наворотили с этими инстансами..

Вроде как сработало, спасибо. Это как-то отразиться на стандартных инстах?

https://rathena.org/board/topic/84123-r17386-instance-system-rewrite/ вот, если не читал.

Изменено пользователем Kubix
Ссылка на комментарий
Поделиться на другие сайты

Вроде как сработало, спасибо. Это как-то отразиться на стандартных инстах?

https://rathena.org/...system-rewrite/ вот, если не читал.

Не думаю что отразится, просто он будет брать mapindex карт из db напрямую, без каких-либо сверок с названием карт (типо есть ли там символ @ и так далее)..

Как они пишут :


While the client restricts map names to 8 characters in the [number]@[name] format, the server is able to send a false name to the clients, allowing any map to be instanced.

Но судя по всему, старые клиенты плохо принимают false name :)

Изменено пользователем Nurkz
  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...
Яндекс.Метрика