PDA

View Full Version : Share cách tạo phó bản Event.



duycarry
11-08-16, 07:24 PM
Tình hình là từ khi mấy pro box CQ ra đi thì box CQ lặng quá.
Giờ mình sẽ hướng dẫn cho các bạn tạo 1 Event phó bản tùy thích dạng như Event Cổ mộ. Cùng nhau học hỏi phát triển server offline. :>
TẠO EVENT PHÓ BẢN:
Vì dựa trên Event cổ mộ nên chúng ta chỉ cần edit và thêm 1 số cái là được. Edit xong các bạn lưu file dưới 1 cái tên khác nhé. Nhớ Edit lời thoại cũng như tên map.
Đầu tiên chúng ta sẽ vào đường dẫn:

sys/party/gumu

#include <npc.h>
#include <ansi.h>
#include <cmd.h>
#include <effect.h>
#include <public.h>
#include <map.h>

#define FILE_MAP "map/copy/705" //đường dẫn file map
#define FILE_SENDER "npc/party/0042" //xa phu để thoát khỏi PB
#define FILE_GUAI "npc/boss/00083" //đường dẫn file quái
#define FILE_BOSS "npc/boss/00082" //đường dẫn file boss
#define CHECK_TIME "sys/party/gumu_check_time" //đường dẫn file thời gian event

#define DEBUG(who,arg) ; //tell_user(who,arg);
#define DEBUG2(who,z,x,y) ;//who->add_to_scene(z,x,y);

inherit OFFICER;

object *Map;
mapping zoubiao=([
1:({96,52}),2:({100,52}),3:({104,54}),4:({103,59}) ,5:({98,59 }),6:({95,61 }),7:({93,66 }),8:({92,70 }),9:({90,74 }),10 : ({87,77 }),
11 : ({82,79 }),12 : ({82,84 }),13 : ({86,86 }),14 : ({92,86 }),15 : ({97,86 }),16 : ({101,84}),17 : ({100,89}),18 : ({97,92 }),19 : ({100,94}),20 : ({103,90}),
21 : ({107,91}),22 : ({105,95}),23 : ({101,97}),24 : ({98,97 }),25 : ({96,99 }),26 : ({103,101}),27 : ({102,104}),28 : ({101,107}),29 : ({106,107}),30 : ({105,111}),
31 : ({108,111}),32 : ({111,113}),33 : ({110,117}),34 : ({115,115}),35 : ({116,119}),36 : ({119,119}),37 : ({122,117}),38 : ({121,121}),39 : ({124,121}),40 : ({125,121}),
41 : ({124,123}),42 : ({124,125}),43 : ({127,123}),44 : ({128,121}),45 : ({130,121}),46 : ({129,124}),47 : ({128,127}),48 : ({130,124}),49 : ({133,122}),50 : ({133,125}),
51 : ({132,128}),52 : ({135,127}),53 : ({136,125}),54 : ({138,123}),55 : ({140,121}),56 : ({140,125}), 57 : ({139,130}), 58 : ({140,130}), 59 : ({143,126}), 60 : ({144,124}),
61 : ({144,122}),62 : ({147,125}),63 : ({146,130}),64 : ({147,129}),65 : ({147,124}), 66 : ({147,126}), 67 : ({147,128}), 68 : ({146,131}), 69 : ({150,128}), 70 : ({150,126}),
71 : ({151,122}),72 : ({151,124}),73 : ({149,127}),74 : ({150,130}),75 : ({152,129}), 76 : ({154,126}), 77 : ({154,123}), 78 : ({155,120}), 79 : ({155,124}), 80 : ({154,128}),
81 : ({154,130}),82 : ({154,131}),83 : ({156,128}),84 : ({157,124}),85 : ({157,126}),86 : ({158,130}), 87 : ({157,133}), 88 : ({159,131}), 89 : ({160,130}), 90 : ({161,127}),
91 : ({162,124}),92 : ({162,122}),93 : ({163,121}),94 : ({163,120}),95 : ({164,124}), 96 : ({163,128}), 97 : ({164,131}), 98 : ({164,129}), 99 : ({165,126}), 100 : ({165,124}),
101 : ({163,121}), 102 : ({164,119}), 103 : ({166,123}), 104 : ({166,126}), 105 : ({167,128}), 106 : ({169,127}), 107 : ({168,124}), 108 : ({168,122}), 109 : ({170,124}), 110 : ({171,127}),
111 : ({173,127}), 112 : ({174,125}), 113 : ({174,124}), 114 : ({174,120}), 115 : ({175,117}), 116 : ({177,117}), 117 : ({177,120}), 118 : ({176,123}), 119 : ({175,126}), 120 : ({175,129}),
121 : ({177,129}), 122 : ({177,128}), 123 : ({178,126}), 124 : ({179,123}), 125 : ({179,120}), 126 : ({180,117}), 127 : ({181,120}), 128 : ({180,123}), 129 : ({180,125}), 130 : ({178,128}),
131 : ({178,132}), 132 : ({180,130}), 133 : ({181,127}), 134 : ({182,125}), 135 : ({184,125}), 136 : ({184,123}), 137 : ({184,127}), 138 : ({185,130}), 139 : ({186,129}), 140 : ({187,127}),
141 : ({190,126}), 142 : ({189,128}), 143 : ({190,131}), 144 : ({193,129}), 145 : ({194,127}), 146 : ({197,125}), 147 : ({197,128}), 148 : ({197,131}), 149 : ({195,135}), 150 : ({198,134}),
151 : ({202,132}), 152 : ({203,130}), 153 : ({206,127}), 154 : ({209,123}), 155 : ({209,127}), 156 : ({209,131}), 157 : ({207,135}), 158 : ({204,137}), 159 : ({201,140}), 160 : ({204,139}),
161 : ({208,135}), 162 : ({211,131}), 163 : ({212,136}), 164 : ({210,140}), 165 : ({208,144}), 166 : ({206,148}), 167 : ({209,146}), 168 : ({212,144}), 169 : ({215,141}), 170 : ({217,138}),
171 : ({219,135}), 172 : ({221,132}), 173 : ({222,135}), 174 : ({226,135}), 175 : ({231,132}), 176 : ({226,136}), 177 : ({223,139}), 178 : ({220,141}), 179 : ({217,144}), 180 : ({214,145}),
181 : ({212,149}), 182 : ({211,153}), 183 : ({209,155}), 184 : ({206,159}), 185 : ({209,160}), 186 : ({205,160}), 187 : ({193,166}), 188 : ({198,168}), 189 : ({201,166}), 190 : ({204,163}),
191 : ({204,166}), 192 : ({206,166}), 193 : ({205,169}), 194 : ({207,169}), 195 : ({206,172}), 196 : ({212,179}), 197 : ({215,183}), 198 : ({218,193}), 199 : ({223,199}), 200 : ({226,204}), //tọa độ quái xuất hiện theo thứ tự từ 1-200. Bạn tự edit lại số lượng quái theo ý thích

]);
int new_copy_scene(object who,object me);
int new_copy_npc(int z,int level);
int new_copy(object who,object me);
//int add_npc(int z,int x,int y,int level);

// 函数:生成二进制码
void SAVE_BINARY() { }

int add_npc(object who,int z,int x,int y,int level);
int add_boss(object who,int z,int x,int y,int level);
//int add_boss(int z,int x,int y,int level);

void create()
{
Map=({});
setup();
}
void do_look(object who,object me)
{
string result;
if(!(CHECK_TIME->get_gumu_party_open())) return;
if(!(CHECK_TIME->get_gumu_open()))
{
result=sprintf(me->get_name()+":\nTương truyền để tưởng nhớ một vị đại tướng của Tần Quốc qua đời, Tần Vương đã ban thưởng những báu vật kỳ lạ để tuẫn táng theo vị đại tướng này. Tin tức về các kì trân dị bảo đã thu hút vô số anh hùng hảo hán đến thám hiểm, tuy nhiên kết cục không ai phá vỡ được Thạch Dũng Trận bên trong Cổ Mộ và đều ra về tay không. Ngươi có muốn thử sức mình không? ( Hãy đến tìm tai để được đến Cổ Mộ mỗi ngày từ 20: 30 đến 22:00).\n");
result+=sprintf(ESC "Rời khỏi");
send_user(who,"%c%c%w%s",':',3,me->get_char_picid(),result);
return;
}
result=sprintf(me->get_name()+":\nTương truyền để tưởng nhớ một vị đại tướng của Tần Quốc qua đời, Tần Vương đã ban thưởng những báu vật kỳ lạ để tuẫn táng theo vị đại tướng này. Tin tức về các kì trân dị bảo đã thu hút vô số anh hùng hảo hán đến thám hiểm, tuy nhiên kết cục không ai phá vỡ được Thạch Dũng Trận bên trong Cổ Mộ và đều ra về tay không. Ngươi có muốn thử sức mình không?\n");
result+=sprintf(ESC "Thám hiểm Cổ mộ\ntalk %x# welcome.1\n",getoid(me));
result+=sprintf(ESC "Rời khỏi");
send_user(who,"%c%c%w%s",':',3,me->get_char_picid(),result);
}

void do_welcome(object me, object who,string arg)
{
int i,flag,size,x,y,z,p,tid;
int level=0;
string result;
object map,*team;


who->set_time("time",0);
flag=to_int(arg);
switch(flag)
{
case 1:
team=who->get_team();
size=sizeof(team);
if(!(CHECK_TIME->get_gumu_party_open())) return;
if(!(CHECK_TIME->get_gumu_open())) return;
if(!who->is_leader())
{
result=sprintf(me->get_name()+":\n Hãy gọi đội trưởng tới gặp ta !\n");
result+=sprintf(ESC"Rời khỏi");
send_user(who,"%c%c%w%s",':',3,me->get_char_picid(),result);
return;
}

if(size<2)
{
result=sprintf(me->get_name()+":\n Lập tổ đội 2 người trở lên rồi mới đến gặp ta !\n");
result+=sprintf(ESC"Rời khỏi");
send_user(who,"%c%c%w%s",':',3,me->get_char_picid(),result);
return;
}

for(i=0;i<size;i++)
{
if(!objectp(team[i])) continue;
if(!inside_screen_2(me,team[i]))
{
result=sprintf(me->get_name()+":\n Hãy gọi tất cả thành viên trong nhóm đến gặp ta !\n");
result+=sprintf(ESC "Rời khỏi");
send_user(who,"%c%c%w%s",':',3,me->get_char_picid(),result);
return;
}
if(team[i]->get_level()<20)
{
result=sprintf(me->get_name()+":\n Thành viên trong nhóm ngươi "HIR "%s "NOR "cấp bậc chưa đủ 20 cấp !\n",team[i]->get_name() );
result+=sprintf(ESC "Rời khỏi");
send_user(who,"%c%c%w%s",':',3,me->get_char_picid(),result);
return;
}
}

if(!new_copy(who,me)==1) return;
tid =who->get("team_id");
map = TEAM_D->get_copy_scene(tid,COPY_GUMU);
if ( map )
{
z=map->get_id();
x=102;y=62; //]tọa độ khi dịch chuyển vào PB
if(!p=get_valid_xy( z, x, y, IS_CHAR_BLOCK)) return;
x = ( p % 1000000 ) / 1000; y = p % 1000;
for(i=0;i<sizeof(team);i++)
{
team[i]->set("me_die",1);
send_user(team[i], "%c%c%w%s", 0x5a, 0, 3, "Đang di chuyển……");
team[i]->set_2("travel.z", z);
team[i]->set_2("travel.p",p);
team[i]->set("map",map);
set_effect(team[i], EFFECT_TRAVEL, 3);
// team[i]->add_to_scene(z,x,y,3);
if(is_god(team[i]))
{
DEBUG(team[i],sprintf("测试--do_look z=%d,level=%d",z,map->get("copy_level")));
}

}
}
break;
}
}
//创建新的虚拟场景395并把NPC放入指定� �置(94,54)处;
int new_copy_scene(object who,object me)
{
int z,d,tid,i,size;
object map,npc,*team;
d=395; //id map
tid=who->get_team_id();
if(!tid)return 0;
team=who->get_team();
size=sizeof(team);
z = COPY_CTROL->new_scene(d,FILE_MAP,"Cổ Mộ");
if(!z) return 0;
if(!objectp(map=get_map_object(z))||!map->is_virtual_scene())
return 0;
TEAM_D->add_copy_scene(tid,COPY_GUMU,map);
map->set("copy_id",1);
map->set("gumu_map",1);
Map+=({map});
npc=new(FILE_SENDER); //新建一副本NPC-->场景传送人
if(!npc) return 0;
npc->add_to_scene(z,94,52,3);
for(i=0;i<size;i++)
{
team[i]->set("team_id",tid);
map->set_owner(team[i]);
}
return z;
}
// 生成副本第一个怪并把放入第一个指� �位置(78,81)
int new_copy_npc(int z,int level)
{
int key,*xy,ap,hp;
object map,npc;

key=1;
xy=zoubiao[key];
if(!objectp(map=get_map_object(z))||!map->is_virtual_scene())
return 0;
npc=new(FILE_GUAI);
if(!npc) return 0;
npc->set_level(level);
NPC_ENERGY_D->init_level(npc,level);
npc->set_fight_status(level);
// npc->set_name(sprintf("Thủ Mộ Thạch Dũng %d ",key));
npc->add_to_scene(z,xy[0],xy[1],3);
map->set("copy_npc_sum",200);
map->add("copy_npc_count",1);
DEBUG(this_player(),sprintf("测试--new_copy_npc->copy_npc_count=%d",map->get("copy_npc_count")));
return 1;
}
//生成虚拟场景。
int new_copy(object who,object me)
{
int i,tid,size,z;
int level=0;
object *team,map;
//求出队伍的平均级别
tid=who->get_team_id();
if(!tid) return 0;
if(!team=who->get_team()) return 0;
for(i=0,size=sizeof(team);i<size;i++)
level+=team[i]->get_level();
level=level/size;

z=new_copy_scene(who,me);
if(!z) return 0;
if(!objectp(map=get_map_object(z))||!map->is_virtual_scene())
return 0;
if(!new_copy_npc(z,level)) return 0;
map->set("copy_level",level);
return 1;

}
//npc 死亡处理
void npc_die(object who,object me)
{
int z,level,key,*xy,i,size,count,tid;
string result;
object map,*team=({});

team=who->get_team();
if(!team) team=({who});
size=sizeof(team);
tid=who->get("team_id");
DEBUG(who,sprintf("tid=%d",tid));
map=who->get("map");
// map=TEAM_D->get_copy_scene(tid,COPY_GUMU);
if(!map) return;
z=map->get_id();
DEBUG(who,sprintf("z=%d",z));
level=map->get("copy_level");
map->add("kill_npc_count",1);
key=map->get("kill_npc_count");
count=map->get("copy_npc_count");
for(i=0;i<size;i++)
{
send_user(team[i],"%c%s",'!',sprintf("Đã tiêu diệt được:"HIY" %d/200",key)); //phần hiển thị số quái tiêu diệt trong PB. Tự edit số lượng quái
DEBUG(team[i],sprintf("测试--npc_die key=%d",key));
DEBUG(team[i],sprintf("测试--npc_die kill_npc_count=%d",key));
}
if((count>0&&count<50)||(count>50&&count<100)|| //vd số lượng quái ta muốn chỉnh là 100 ta sẽ edit phần này như sau: if((count>0&&count<25)||(count>25&&count<50||
(count>100&&count<150)||(count>150&&count<200)) //(count>50&&count<75)||(count>75&&count<100))
{
xy=zoubiao[key+1];
__FILE__->add_npc(who,z,xy[0],xy[1],level);
for(i=0;i<size;i++)
{
DEBUG(team[i],sprintf("测试--下一个NPC key=%d x=%d y=%d",key+1,xy[0],xy[1]));
DEBUG2(team[i],map->get_id(),xy[0]+1,xy[1]+1);
}
}
if(count==50||count==100||count==150)
{
xy=zoubiao[key+1];
__FILE__->add_npc(who,z,xy[0],xy[1],level);
for(i=0;i<size;i++)
{
DEBUG(team[i],sprintf("测试--下一个NPC key=%d x=%d y=%d",key+1,xy[0],xy[1]));
DEBUG2(team[i],map->get_id(),xy[0]+1,xy[1]+1);
}
xy=zoubiao[key+2];
__FILE__->add_npc(who,z,xy[0],xy[1],level);
for(i=0;i<size;i++)
{
DEBUG(team[i],sprintf("测试--下一个NPC key=%d x=%d y=%d",key+1,xy[0],xy[1]));
DEBUG2(team[i],map->get_id(),xy[0]+1,xy[1]+1);
}
}
if(count==200)
{
if(!(key==map->get("copy_npc_sum"))) return;
for(i=0;i<size;i++)
{
send_user(team[i],"%c%s",'!',HIY"Thủ Mộ Thạch Tướng đã tỉnh dậy !");
}
xy=zoubiao[key];
__FILE__->add_boss(who,z,xy[0],xy[1],level);
}

}


int add_npc(object who,int z,int x,int y,int level) //加入小怪
{
int ap,hp,i,size,tid;
object map,npc,*team;

//who=this_player();
tid=who->get("team_id");
DEBUG(who,"add_npc test");
//if(!map=TEAM_D->get_copy_scene(tid,COPY_GUMU)) return;
if(!map=who->get("map")) return;
if(!(map->get("copy_npc_count")<=map->get("copy_npc_sum")))
{
send_user(who,"%c%s",'!',HIY"Thủ Mộ Thạch Tướng đã tỉnh dậy !");
return;
}
npc=new(FILE_GUAI);
if(!npc) return 0;
npc->set_level(level);
NPC_ENERGY_D->init_level(npc,level);
npc->set_fight_status(level);
map->add("copy_npc_count",1);
//npc->set_name(sprintf("Thủ Mộ Thạch Dũng %d ",map->get("copy_npc_count"))); //用于测试
npc->add_to_scene(z,x,y,3);
return 1;
}

//int new_scene(int d, string mapname,string name) //新增副本场景
//{
// int z;
// object map;
// if( ( z = find_map_flag(COPY_MAP_BEGIN, COPY_MAP_END, 0) ) > 0 )
// {
// init_virtual_map(z, d);
// map = new(mapname);
// if(!map) return;
// map->set_client_id(d);
// map->set("gumu_map",1);
// set_map_object( map, map->set_id(z) );
// Map+=({map});
// }
// return z;
//}

int add_boss(object who,int z,int x,int y,int level) //加入大boss
{
int ap,hp,rate,type,tid;
object map,npc;
//who=this_player();
tid=who->get("team_id");
//if(!map=TEAM_D->get_copy_scene(tid,COPY_GUMU)) return;
if(!map=who->get("map")) return;
rate=random100();
npc=new(FILE_BOSS);
if(!npc) return;
if(rate<20) type=1;
else if(rate<40) type=2;
else if(rate<60) type=3;
else if(rate<70) type=4;
else if(rate<90) type=5;
else type=6;

npc->set_level(level);
NPC_ENERGY_D->init_level(npc,level);
npc->set_fight_status(type,level);
npc->add_to_scene(z,x,y,3,9413);
return 1;
}

//24:00时退出还在古墓的所有玩家
void player_exit()
{
int i,j,size1,size2,x,y,z,p;
object *member;
x=276; y=163; z=80; //tọa độ khi thoát ra khỏi PB
if(!Map) return;
size1=sizeof(Map);
for(i=0;i<size1;i++)
{
member=FILE_MAP->get_all_user( Map[i] );
if((size2=sizeof(member))<1) continue;
for(j=0;j<size2;j++)
{
if(!p=get_valid_xy( z, x, y, IS_CHAR_BLOCK)) return;
x = ( p % 1000000 ) / 1000; y = p % 1000;
send_user(member[j],"%c%s",'!',HIY"Ngươi đã vượt qua thời gian thám hiểm !");
call_out("send_player",3,member[j]);
}
}
}

void send_player(object who)
{
int x,y,z,p;
z=80; x=276; y=163; //tọa độ khi thoát ra khỏi PB
if(!p=get_valid_xy( z, x, y, IS_CHAR_BLOCK)) return;
x = ( p % 1000000 ) / 1000; y = p % 1000;
who->add_to_scene(z,x,y);
}

object *delete_map(object map)
{
Map-=({map});
return Map;
}

Tiếp theo:

sys/party/gumu_check_time

/*******************************
**古墓探险**
*******************************/

#include <time.h>
#include <ansi.h>

inherit DBASE_F;
inherit SAVE_F;

#define FILE_NPC "npc/party/0041" //đường dẫn file npc dịch chuyển vào PB
#define PLAYER_EXIT "sys/party/gumu" //đường dẫn file Event ta lưu ở trên
#define FILE_SAVE "data/party"SAVE_EXTENSION
#define DEBUG(arg) if(find_char("9")) tell_user(find_char("9"),arg);


int gumu=0;
int gumu_party=1;


// 函数:生成二进制码
void SAVE_BINARY() { }

//活动开启状态保存
string get_save_file()
{
return FILE_SAVE;
}
void create()
{
restore();
gumu=0;
call_out("check_time",3);
}

void check_time()
{
int iTime,i;
mixed *mixTime;

remove_call_out("check_time");
iTime = get_party_time();
if(!gumu_party) return;
mixTime = localtime(iTime);
if (mixTime[TIME_HOUR]>22) //Thời gian kết thúc Event 22h
{
call_out("check_time",3600*24-mixTime[TIME_HOUR]*3600-mixTime[TIME_MIN]*60);
return;
}
if ( mixTime[TIME_HOUR] <20 ) //Thời gian bắt đầu Event 20h, bạn edit lại mấy con số 3 chỗ 20 nhé. Vd edit là 18h thì 18h30 Event bắt đầu
{
call_out("check_time",20*3600-mixTime[TIME_HOUR]*3600-mixTime[TIME_MIN]*60);
return ;
}
if ( mixTime[TIME_HOUR] ==20 && mixTime[TIME_MIN]<30 )
{
call_out("check_time1",60*(30-mixTime[TIME_MIN]));
return;
}
else
call_out("check_time1",1);
}

void check_time1()
{

int i;
mixed *mixTime;
mixTime=localtime(get_party_time());
if(gumu_party)
{
for(i=0;i<3;i++)
CHAT_D->sys_channel(0,HIR"Thám hiểm Cổ Mộ chính thức bắt đầu, mọi người hãy nhanh đến Chu(276,163) báo danh!");
}
gumu=1;
call_out("check_time2",22*3600-mixTime[TIME_HOUR]*3600-mixTime[TIME_MIN]*60);
}

void check_time2()
{ int i;
mixed *mixTime;
mixTime=localtime(get_party_time());
remove_call_out("check_time2");
if(gumu_party)
{
for(i=0;i<3;i++)
CHAT_D->sys_channel(0,HIR"Thám hiểm Cổ Mộ chính thức kết thúc, mọi người hãy lại đến Chu(276,163) báo danh vào tối mai!");
}
gumu=0;
call_out("player_exit",24*3600-mixTime[TIME_HOUR]*3600-mixTime[TIME_MIN]*60);
call_out("check_time",24*3600-mixTime[TIME_HOUR]*3600-mixTime[TIME_MIN]*60);
}

int get_gumu_open()
{
return gumu;
}

void set_gumu_party_open( int party,int test)
{
if(party==0)
{
if(test)
{
USER_D->gm_channel(HIY"测试活动关闭");
gumu=0;
}
USER_D->gm_channel(HIY"GM正常关闭活动");

}
else
{
if(test)
{
USER_D->gm_channel(HIY"测试活动开启") ;
gumu=1;
}
USER_D->gm_channel(HIY"GM正常开启活动") ;
}
gumu_party=party;
__FILE__->check_time();
save();
}

int get_gumu_party_open()
{
return gumu_party;
}

string get_party_statue()
{
if(get_gumu_party_open()&&get_gumu_open())
return "古墓探险活动处于开始状态";
else if(get_gumu_party_open())
return "古墓探险活动处于正常开启状态";
return "古墓探险活动处于关闭状态";
}

//void add_npc(int z,int x,int y)
//{
// object npc,map;
// npc=new(FILE_NPC);
// if(!npc) return;
// if(!z&&!x&&!y) return;
// if(!objectp(map=get_map_object(z))) return;
// npc->add_to_scene(z,x,y,4,9413);
// map->set("npc",npc);
//}
//
//void delete_npc(int z)
//{
// object map,npc;
// if(!z) return;
// if(!objectp(map=get_map_object(z))) return;
// npc=map->get("npc");
// npc->remove_from_scene();
// destruct(npc);
// map->delete("npc");
//
//}

void player_exit()
{
PLAYER_EXIT->player_exit();
}
Tiếp tục chúng ta vào:

npc/party/0041 và
npc/party/0042
Các bạn tự đối chiếu lại tên 2 file ở trên rồi edit lại nhé.

Về phần map:

map/copy

#define FILE_GUMU "sys/party/gumu" //Đây là đường dẫn tới file Event, chúng ta edit phần này theo tên file Event các bạn tạo.

inherit COPY_MAP;

// 函数:构造处理
void create()
{
object me = this_object();

set_client_id(703); //]Id map. Id map các bạn có thể vào client phần map xem id, mấy cái file số vd: 970.dat chính là id map. Test map bằng cách vào game gõ lệnh /go2map id
set_name("Cổ Mộ"); //Tên map

if( !clonep(me) ) return;

set_heart_timer( me, set_heart_timer_2(me, getoid(me) % 10) ); // 心跳随机
set_heart_loop(me, 600); // 循环心跳:1分钟
me->heart_beat();
set_heart_beat(1);
}

// 函数:心跳处理(循环)
void heart_beat_loop( int effect1, int effect2, int effect3, int effect4, int effect5, int effect6, int effect7, int effect8 ) { __FILE__ ->heart_beat_loop_callout( this_object(), effect1, effect2, effect3, effect4, effect5, effect6, effect7, effect8 ); }

// 函数:心跳处理(循环)(在线更新)
void heart_beat_loop_callout( object map, int effect1, int effect2, int effect3, int effect4, int effect5, int effect6, int effect7, int effect8 ) // 每1分处理
{
object *nMember;
nMember = __FILE__->get_all_user( map );
if ( nMember )
nMember -= ({0});
if ( sizeof(nMember) )
return ;
//副本内无玩家,删除此副本
FILE_GUMU->delete_map(map);
COPY_MAP->destruct_virtual_map( map, map->get_id() );
}
object *get_all_user( object map )
{
object *item, who, *npc=({}),*all=({});
int z, x, y, p, max_x, max_y;
int i, size;

reset_eval_cost();

z = map->get_id(); max_x = get_map_max_x(z); max_y = get_map_max_y(z);

for( x = 0; x < max_x; x += AREA_SIZE ) for( y = 0; y < max_y; y += AREA_SIZE )
{
if( have_scene_object(z, x, y, USER_TYPE, 1) )
{
item = get_scene_object(z, x, y, USER_TYPE, 1);

for( i = 0, size = sizeof(item); i < size; i ++ ) if( who = item[i] )
{
all += ({ item[i] });
}
}
}
for (i=0;i<sizeof(all);i++)
{
if (all[i]->is_user())
npc += ({all[i]});
}
return npc;
}

Các bạn nhớ add npc dịch chuyển là 0041 ở trên vào map nhé, vào Chu cho tiện. Mình chỉ luôn đường dẫn cho các bạn chưa biết cách add npc vào map. Dựa theo npc ở trên mà add.

map/npc/city.c

Vậy là xong. Có gì thắc mắc các bạn cứ hỏi ở topic này mình sẽ trả lời giúp :)

Dreamy
13-08-16, 08:04 AM
:3
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>

duycarry
13-08-16, 02:48 PM
:3
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>

:-bd Để lính vậy giống Cổ Mộ lắm 30 charrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

kelalung
24-08-16, 08:22 PM
tâm huyết ghê..... quá đi
giỏi quá

quancoi000
24-08-16, 11:09 PM
Thấy cảm phục những người như bạn cực ấy! Mấy bài ghim toàn từ 2010 2012 mà đến giờ bạn vẫn còn đam mê! Thực sự là mình chẳng biết sv này ntn cả. Thấy bài mới trên 4r thì vào xem. Cảm ơn bạn!