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

PvP на опр. клетаках!


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

Здравствуйте! Хотел узнать как можно реализовать ПВП только на определенных клетках на арене?

Как бы что-бы зрителей не могли атаковать и что-бы зрители не дрались,а просто смотрели!

Вот что я пытался сделать!

Пвп на локе отключено,а по кординатам должно было включаться!

Пробовал вместо basilica ставить pvp , pvp_off только значения менять на 0!

Сборка: 3ceam

Вот что искал нашел по этой теме: Тык и Тык

Кто что подскажет?


pvp_2v2,1,1,1 script NoPvPDuelArena -1,{
end;
OnInit:
// Можно
setcell "pvp_2v2.gat",41,52,41,39,cell_basilica,1;
setcell "pvp_2v2.gat",41,39,62,39,cell_basilica,1;
setcell "pvp_2v2.gat",62,39,62,52,cell_basilica,1;
setcell "pvp_2v2.gat",62,52,41,52,cell_basilica,1;
}

Вот схема работы моей идеи!

FRLqdJQl61A.jpg

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

Проблему товарищу решили, сорс модификацию исправили.

Готовое решение (большая часть копипаста и исходники там старенькие использовали, но вы без проблем поймёте чего и куда вставлять):


//battle.c
//find this
int battle_check_target( struct block_list *src, struct block_list *target,int flag)
//add this before it
bool cell_pk_check(struct block_list *t_bl, struct block_list *s_bl, int m)
{
if(t_bl->type == BL_PC && map[m].cell[s_bl->x+s_bl->y*map[m].xs].pk == true && map[m].cell[t_bl->x+t_bl->y*map[m].xs].pk == true) {
int s_party = status_get_party_id(s_bl);
int s_guild = status_get_guild_id(s_bl);
if( s_party && s_party == status_get_party_id(t_bl) ) {
if(map[m].flag.pvp_noparty)
return true;
else
return false;
}
if( s_guild && s_guild == status_get_guild_id(t_bl) ) {
if(map[m].flag.pvp_noguild && map[m].flag.gvg)
return true;
else
return false;
}
return true;
}
return false;
}
//+++++++++++++++++++++++++++++++++//

//find this
else if(( sd->duel_group && !((!battle_config.duel_allow_pvp && map[m].flag.p
//use this to replace
else if(( sd->duel_group && !((!battle_config.duel_allow_pvp && map[m].flag.pvp) || (!battle_config.duel_allow_gvg && map_flag_gvg(m))))||( cell_pk_check(t_bl, s_bl, m) == true ))

//+++++++++++++++++++++++++++++++++//

//map.c
void map_setcell(int m, int x, int y, cell_t cell, bool flag)
{
int j;
if( m < 0 || m >= map_num || x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys )
return;
j = x + y*map[m].xs;
switch( cell ) {
case CELL_WALKABLE: map[m].cell[j].walkable = flag; break;
case CELL_SHOOTABLE: map[m].cell[j].shootable = flag; break;
case CELL_WATER: map[m].cell[j].water = flag; break;
case CELL_NPC: map[m].cell[j].npc = flag; break;
case CELL_BASILICA: map[m].cell[j].basilica = flag; break;
case CELL_LANDPROTECTOR: map[m].cell[j].landprotector = flag; break;
case CELL_NOVENDING: map[m].cell[j].novending = flag; break;
case CELL_NOCHAT: map[m].cell[j].nochat = flag; break;

case CELL_PK: map[m].cell[j].pk = flag; break; //<---add this line

default:
ShowWarning("map_setcell: invalid cell type '%d'\n", (int)cell);
break;
}
}

//+++++++++++++++++++++++++++++++++//

//map.h
typedef enum {
CELL_WALKABLE,
CELL_SHOOTABLE,
CELL_WATER,
CELL_NPC,
CELL_BASILICA,
CELL_LANDPROTECTOR,
CELL_NOVENDING,
CELL_NOCHAT,
CELL_MAELSTROM,
CELL_ICEWALL,
CELL_PK, // <---add this line
} cell_t;

//+++++++++++++++++++++++++++++++++//

struct mapcell
{
// terrain flags
unsigned char
walkable : 1,
shootable : 1,
water : 1;

// dynamic flags
unsigned char
npc : 1,
basilica : 1,
landprotector : 1,
novending : 1,
nochat : 1,
pk : 1;//<---add this

//+++++++++++++++++++++++++++++++++//

// db\const.txt
cell_walkable 0
cell_shootable 1
cell_water 2
cell_npc 3
cell_basilica 4
cell_landprotector 5
cell_novending 6
cell_nochat 7
cell_pk 10 // <---add this line

//+++++++++++++++++++++++++++++++++//

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

Проблему товарищу решили, сорс модификацию исправили.

Готовое решение (большая часть копипаста и исходники там старенькие использовали, но вы без проблем поймёте чего и куда вставлять):


//battle.c
//find this
int battle_check_target( struct block_list *src, struct block_list *target,int flag)
//add this before it
bool cell_pk_check(struct block_list *t_bl, struct block_list *s_bl, int m)
{
if(t_bl->type == BL_PC && map[m].cell[s_bl->x+s_bl->y*map[m].xs].pk == true && map[m].cell[t_bl->x+t_bl->y*map[m].xs].pk == true) {
int s_party = status_get_party_id(s_bl);
int s_guild = status_get_guild_id(s_bl);
if( s_party && s_party == status_get_party_id(t_bl) ) {
if(map[m].flag.pvp_noparty)
return true;
else
return false;
}
if( s_guild && s_guild == status_get_guild_id(t_bl) ) {
if(map[m].flag.pvp_noguild && map[m].flag.gvg)
return true;
else
return false;
}
return true;
}
return false;
}
//+++++++++++++++++++++++++++++++++//

//find this
else if(( sd->duel_group && !((!battle_config.duel_allow_pvp && map[m].flag.p
//use this to replace
else if(( sd->duel_group && !((!battle_config.duel_allow_pvp && map[m].flag.pvp) || (!battle_config.duel_allow_gvg && map_flag_gvg(m))))||( cell_pk_check(t_bl, s_bl, m) == true ))

//+++++++++++++++++++++++++++++++++//

//map.c
void map_setcell(int m, int x, int y, cell_t cell, bool flag)
{
int j;
if( m < 0 || m >= map_num || x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys )
return;
j = x + y*map[m].xs;
switch( cell ) {
case CELL_WALKABLE: map[m].cell[j].walkable = flag; break;
case CELL_SHOOTABLE: map[m].cell[j].shootable = flag; break;
case CELL_WATER: map[m].cell[j].water = flag; break;
case CELL_NPC: map[m].cell[j].npc = flag; break;
case CELL_BASILICA: map[m].cell[j].basilica = flag; break;
case CELL_LANDPROTECTOR: map[m].cell[j].landprotector = flag; break;
case CELL_NOVENDING: map[m].cell[j].novending = flag; break;
case CELL_NOCHAT: map[m].cell[j].nochat = flag; break;

case CELL_PK: map[m].cell[j].pk = flag; break; //<---add this line

default:
ShowWarning("map_setcell: invalid cell type '%d'\n", (int)cell);
break;
}
}

//+++++++++++++++++++++++++++++++++//

//map.h
typedef enum {
CELL_WALKABLE,
CELL_SHOOTABLE,
CELL_WATER,
CELL_NPC,
CELL_BASILICA,
CELL_LANDPROTECTOR,
CELL_NOVENDING,
CELL_NOCHAT,
CELL_MAELSTROM,
CELL_ICEWALL,
CELL_PK, // <---add this line
} cell_t;

//+++++++++++++++++++++++++++++++++//

struct mapcell
{
// terrain flags
unsigned char
walkable : 1,
shootable : 1,
water : 1;

// dynamic flags
unsigned char
npc : 1,
basilica : 1,
landprotector : 1,
novending : 1,
nochat : 1,
pk : 1;//<---add this

//+++++++++++++++++++++++++++++++++//

// db\const.txt
cell_walkable 0
cell_shootable 1
cell_water 2
cell_npc 3
cell_basilica 4
cell_landprotector 5
cell_novending 6
cell_nochat 7
cell_pk 10 // <---add this line

//+++++++++++++++++++++++++++++++++//

Огромное спасибо данному человеку!! Единственный кто помог в данной проблеме!

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

Народ подскажите,атаковать можно но только при зажатой клавишей Shift что можно сделать с этой проблемой? /shift не вариант не помогает!

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

  • 2 недели спустя...

Народ подскажите,атаковать можно но только при зажатой клавишей Shift что можно сделать с этой проблемой? /shift не вариант не помогает!

/nc off, /ns on...

Потом refresh....мне помогало.

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

×
×
  • Создать...
Яндекс.Метрика