// script.c
// после функции BUILDIN(bg_reward)
// { ..... }
ставим
BUILDIN(bg_team_reveal)
{
struct battleground_data *bgd;
int bg_id;
bg_id = script_getnum(st,2);
if( (bgd = bg->team_search(bg_id)) == NULL )
return false;
bgd->reveal_pos_sub = 1; // Reveal Position Mode
return true;
}
// ниже / выше, полностью меняем функцию bg_create_team на:
BUILDIN(bg_create_team) {
const char *map_name, *ev = "", *dev = "";
int x, y, map_index = 0, bg_id;
map_name = script_getstr(st,2);
if( strcmp(map_name,"-") != 0 ) {
map_index = script->mapindexname2id(st,map_name);
if( map_index == 0 ) { // Invalid Map
script_pushint(st,0);
return true;
}
}
x = script_getnum(st,3);
y = script_getnum(st,4);
ev = script_getstr(st,5); // Logout Event
dev = script_getstr(st,6); // Die Event
if( (bg_id = bg->create(map_index, x, y, ev, dev)) == 0 ) { // Creation failed
script_pushint(st,-1);
} else
script_pushint(st,bg_id);
return true;
}
// battleground.h, ищем struct battleground_data {
// и после unsigned short mapindex, x, y;
// добавляем:
int reveal_pos_sub, reveal_flag;
// дальше, ищем struct battleground_interface {
// добавляем в конец, перед enum bg_queue_types (*str2teamtype) (const char *str);
int (*reveal_pos_sub) (struct block_list *bl, va_list ap);
// battleground.c, перед :
// Player joins team
// bool bg_team_join(int bg_id, struct map_session_data *sd) {
// добавляем:
int bg_send_dot_remove(struct map_session_data *sd)
{
struct battleground_data *bgd;
int m;
if( sd && sd->bg_id && (bgd = bg->team_search(sd->bg_id)) != NULL )
{
clif->bg_xy_remove(sd);
if( bg->reveal_pos_sub && (m = map->mapindex2mapid(bgd->mapindex)) == sd->bl.m )
map->foreachinmap(bg->reveal_pos_sub, m, BL_PC, sd, 2, 0xFFFFFF);
}
return true;
}
// полностью меняем функцию int bg_create(unsigned short map_index, short rx, short ry, const char *ev, const char *dev) {
// на:
int bg_create(unsigned short map_index, short rx, short ry, const char *ev, const char *dev) {
struct battleground_data *bgd;
bg->team_counter++;
CREATE(bgd, struct battleground_data, 1);
bgd->bg_id = bg->team_counter;
bgd->count = 0;
bgd->mapindex = map_index;
bgd->x = rx;
bgd->y = ry;
safestrncpy(bgd->logout_event, ev, sizeof(bgd->logout_event));
safestrncpy(bgd->die_event, dev, sizeof(bgd->die_event));
memset(&bgd->members, 0, sizeof(bgd->members));
idb_put(bg->team_db, bg->team_counter, bgd);
return bgd->bg_id;
}
// перед функцией int bg_afk_timer(int tid, int64 tick, int id, intptr_t data) {
// добавляем:
int bg_reveal_pos_sub(struct block_list *bl, va_list ap)
{
struct map_session_data *pl_sd, *sd = NULL;
int flag, color;
pl_sd = (struct map_session_data *)bl;
sd = va_arg(ap,struct map_session_data *); // Source
flag = va_arg(ap,int);
color = va_arg(ap,int);
if( pl_sd->bg_id == sd->bg_id )
return false; // Same Team
clif->viewpoint(pl_sd,sd->bl.id,flag,sd->bl.x,sd->bl.y,sd->bl.id,color);
return true;
}
// крутим вниз, и перед bg->str2teamtype = bg_str2teamtype;
// добавляем:
bg->reveal_pos_sub = bg_reveal_pos_sub;