I've been researching how to put pvp in just one area of map, such as the center of Prontera found a change in eAthena allowing leaves an area in PK mode which is very functional, but I wish it was pvp instead of PK. wanted someone to help me leave it so pvp. Modifications of SRC
//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)
{
if(status_get_party_id(t_bl)==status_get_party_id(s_bl))
if(map[m].flag.pvp_noparty)
return true;
else
return false;
if(status_get_guild_id(t_bl)==status_get_guild_id(s_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
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_PK,//<---add this
} 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 8//<---add this
//+++++++++++++++++++++++++++++++++//
Example of how the script would
- script SetPvPCells -1,{
end;
OnInit:
//setcell "prontera",<x1>,<y1>,<x2>,<y2>,<type>,<flag>;
//A1
setcell "prontera",133,192,142,170,cell_pvp,1;
setcell "prontera",126,185,134,178,cell_pvp,1;
setcell "prontera",141,185,149,178,cell_pvp,1;