- Cleaned up some more the code so it works for -DTURBO
- Cleaned the pvpoff @ and script commands. - mob_get_random_id now has two additional flags to specify that the monster to acquire should not be a boss type (4) or that it should give exp (8). - TK_MISSION will now pick any mob from the DB as long as it is not a boss type and it gives base exp. - Fixed the double-stone issue when hitting a petrified character. - Minor cleanups git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9573 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
dd92bd13fd
commit
58bb9be68a
@ -3,6 +3,11 @@ Date Added
|
||||
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
|
||||
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||
|
||||
2006/12/26
|
||||
* TK_MISSION will now pick any mob from the DB as long as it is not a boss
|
||||
type and it gives base exp.
|
||||
* Fixed the double-stone issue when hitting a petrified character.
|
||||
[Skotlex]
|
||||
2006/12/25
|
||||
* Fixed buildin_getscrate, thanks Trancid.
|
||||
* Applied part 1 of TheUltraMage's socket cleanup.
|
||||
|
@ -1665,11 +1665,8 @@ int count_users(void) {
|
||||
int mmo_char_send006b(int fd, struct char_session_data *sd) {
|
||||
int i, j, found_num;
|
||||
struct mmo_charstatus *p;
|
||||
//#ifdef NEW_006b
|
||||
const int offset = 24;
|
||||
//#else
|
||||
// const int offset = 4;
|
||||
//#endif
|
||||
WFIFOHEAD(fd, offset + 9*108);
|
||||
|
||||
set_char_online(-1, 99,sd->account_id);
|
||||
|
||||
@ -1687,11 +1684,9 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
|
||||
|
||||
#if PACKETVER > 7
|
||||
//Updated packet structure with rename-button included. Credits to Sara-chan
|
||||
WFIFOHEAD(fd, offset + found_num * 108);
|
||||
memset(WFIFOP(fd,0), 0, offset + found_num * 108);
|
||||
WFIFOW(fd,2) = offset + found_num * 108;
|
||||
#else
|
||||
WFIFOHEAD(fd, offset + found_num * 106);
|
||||
memset(WFIFOP(fd,0), 0, offset + found_num * 106);
|
||||
WFIFOW(fd,2) = offset + found_num * 106;
|
||||
#endif
|
||||
|
@ -1708,11 +1708,9 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
|
||||
|
||||
#if PACKETVER > 7
|
||||
//Updated packet structure with rename-button included. Credits to Sara-chan
|
||||
WFIFOHEAD(fd, offset + found_num * 108);
|
||||
memset(WFIFOP(fd, 0), 0, offset + found_num * 108);
|
||||
WFIFOW(fd, 2) = offset + found_num * 108;
|
||||
#else
|
||||
WFIFOHEAD(fd, offset + found_num * 106);
|
||||
memset(WFIFOP(fd, 0), 0, offset + found_num * 106);
|
||||
WFIFOW(fd, 2) = offset + found_num * 106;
|
||||
#endif
|
||||
|
@ -58,7 +58,7 @@ extern time_t stall_time;
|
||||
|
||||
#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
|
||||
#ifdef TURBO
|
||||
#define WFIFOHEAD(fd, x) uint8 *wbPtr ## fd = fd?(session[fd]->wdata+session[fd]->wdata_size):0;
|
||||
#define WFIFOHEAD(fd, x) uint8 *wbPtr ## fd = (fd>0&&session[fd])?(session[fd]->wdata+session[fd]->wdata_size):NULL;
|
||||
#define WFIFOP(fd,pos) (&wbPtr ## fd[pos])
|
||||
#else
|
||||
#define WFIFOHEAD(fd, size) do{ if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }while(0)
|
||||
|
@ -3013,6 +3013,16 @@ int atcommand_gm(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int atcommand_pvpoff_sub(struct block_list *bl,va_list ap) {
|
||||
TBL_PC* sd = (TBL_PC*)bl;
|
||||
clif_pvpset(sd, 0, 0, 2);
|
||||
if (sd->pvp_timer != UINT_MAX) {
|
||||
delete_timer(sd->pvp_timer, pc_calc_pvprank_timer);
|
||||
sd->pvp_timer = UINT_MAX;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
*
|
||||
*------------------------------------------
|
||||
@ -3030,26 +3040,15 @@ int atcommand_pvpoff(
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (map[sd->bl.m].flag.pvp) {
|
||||
map[sd->bl.m].flag.pvp = 0;
|
||||
clif_send0199(sd->bl.m, 0);
|
||||
|
||||
pl_allsd = map_getallusers(&users);
|
||||
for (i = 0; i < users; i++) { //人数分ループ
|
||||
if ((pl_sd = pl_allsd[i]) && sd->bl.m == pl_sd->bl.m) {
|
||||
clif_pvpset(pl_sd, 0, 0, 2);
|
||||
if (pl_sd->pvp_timer != -1) {
|
||||
delete_timer(pl_sd->pvp_timer, pc_calc_pvprank_timer);
|
||||
pl_sd->pvp_timer = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
clif_displaymessage(fd, msg_txt(31)); // PvP: Off.
|
||||
} else {
|
||||
if (!map[sd->bl.m].flag.pvp) {
|
||||
clif_displaymessage(fd, msg_txt(160)); // PvP is already Off.
|
||||
return -1;
|
||||
}
|
||||
|
||||
map[sd->bl.m].flag.pvp = 0;
|
||||
clif_send0199(sd->bl.m, 0);
|
||||
map_foreachinmap(atcommand_pvpoff_sub,sd->bl.m, BL_PC);
|
||||
clif_displaymessage(fd, msg_txt(31)); // PvP: Off.
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -5182,15 +5182,15 @@ int clif_set0199(int fd,int type)
|
||||
*/
|
||||
int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type)
|
||||
{
|
||||
nullpo_retr(0, sd);
|
||||
int fd = sd->fd;
|
||||
|
||||
if(type == 2) {
|
||||
WFIFOHEAD(sd->fd,packet_len(0x19a));
|
||||
WFIFOW(sd->fd,0) = 0x19a;
|
||||
WFIFOL(sd->fd,2) = sd->bl.id;
|
||||
WFIFOL(sd->fd,6) = pvprank;
|
||||
WFIFOL(sd->fd,10) = pvpnum;
|
||||
WFIFOSET(sd->fd,packet_len(0x19a));
|
||||
WFIFOHEAD(fd,packet_len(0x19a));
|
||||
WFIFOW(fd,0) = 0x19a;
|
||||
WFIFOL(fd,2) = sd->bl.id;
|
||||
WFIFOL(fd,6) = pvprank;
|
||||
WFIFOL(fd,10) = pvpnum;
|
||||
WFIFOSET(fd,packet_len(0x19a));
|
||||
} else {
|
||||
unsigned char buf[32];
|
||||
WBUFW(buf,0) = 0x19a;
|
||||
@ -5971,27 +5971,21 @@ int clif_party_option(struct party_data *p,struct map_session_data *sd,int flag)
|
||||
|
||||
nullpo_retr(0, p);
|
||||
|
||||
// if(battle_config.etc_log)
|
||||
// printf("clif_party_option: %d %d %d\n",p->exp,p->item,flag);
|
||||
if(sd==NULL && flag==0){
|
||||
if(!sd && flag==0){
|
||||
int i;
|
||||
for(i=0;i<MAX_PARTY && !p->data[i].sd;i++);
|
||||
if (i < MAX_PARTY)
|
||||
sd = p->data[i].sd;
|
||||
}
|
||||
if(sd==NULL)
|
||||
return 0;
|
||||
if(!sd) return 0;
|
||||
WBUFW(buf,0)=0x101;
|
||||
// WBUFL(buf,2) // that's how the client reads it, still need to check it's uses [FlavioJS]
|
||||
WBUFW(buf,2)=((flag&0x01)?2:p->party.exp);
|
||||
WBUFW(buf,4)=0; //NOTE: We don't know yet what this is for, it is NOT for item share rules, though. [Skotlex]
|
||||
WBUFW(buf,4)=0;
|
||||
if(flag==0)
|
||||
clif_send(buf,packet_len(0x101),&sd->bl,PARTY);
|
||||
else {
|
||||
WFIFOHEAD(sd->fd,packet_len(0x101));
|
||||
memcpy(WFIFOP(sd->fd,0),buf,packet_len(0x101));
|
||||
WFIFOSET(sd->fd,packet_len(0x101));
|
||||
}
|
||||
else
|
||||
clif_send(buf,packet_len(0x101),&sd->bl,SELF);
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
@ -6005,24 +5999,24 @@ int clif_party_leaved(struct party_data *p,struct map_session_data *sd,int accou
|
||||
|
||||
nullpo_retr(0, p);
|
||||
|
||||
if(!sd && (flag&0xf0)==0)
|
||||
{
|
||||
for(i=0;i<MAX_PARTY && !p->data[i].sd;i++);
|
||||
if (i < MAX_PARTY)
|
||||
sd = p->data[i].sd;
|
||||
}
|
||||
|
||||
if(!sd) return 0;
|
||||
|
||||
WBUFW(buf,0)=0x105;
|
||||
WBUFL(buf,2)=account_id;
|
||||
memcpy(WBUFP(buf,6),name,NAME_LENGTH);
|
||||
WBUFB(buf,30)=flag&0x0f;
|
||||
|
||||
if((flag&0xf0)==0){
|
||||
if(sd==NULL) {
|
||||
for(i=0;i<MAX_PARTY && !p->data[i].sd;i++);
|
||||
if (i < MAX_PARTY)
|
||||
sd = p->data[i].sd;
|
||||
}
|
||||
if (sd)
|
||||
clif_send(buf,packet_len(0x105),&sd->bl,PARTY);
|
||||
} else if (sd!=NULL) {
|
||||
WFIFOHEAD(sd->fd,packet_len(0x105));
|
||||
memcpy(WFIFOP(sd->fd,0),buf,packet_len(0x105));
|
||||
WFIFOSET(sd->fd,packet_len(0x105));
|
||||
}
|
||||
if((flag&0xf0)==0)
|
||||
clif_send(buf,packet_len(0x105),&sd->bl,PARTY);
|
||||
else
|
||||
clif_send(buf,packet_len(0x105),&sd->bl,SELF);
|
||||
return 0;
|
||||
}
|
||||
/*==========================================
|
||||
|
@ -364,7 +364,7 @@ int intif_send_guild_storage(int account_id,struct guild_storage *gstor)
|
||||
return 0;
|
||||
WFIFOHEAD(inter_fd,sizeof(struct guild_storage)+12);
|
||||
WFIFOW(inter_fd,0) = 0x3019;
|
||||
WFIFOW(inter_fd,2) = sizeof(struct guild_storage)+12;
|
||||
WFIFOW(inter_fd,2) = (unsigned short)sizeof(struct guild_storage)+12;
|
||||
WFIFOL(inter_fd,4) = account_id;
|
||||
WFIFOL(inter_fd,8) = gstor->guild_id;
|
||||
memcpy( WFIFOP(inter_fd,12),gstor, sizeof(struct guild_storage) );
|
||||
|
@ -237,15 +237,17 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data)
|
||||
* 1: poring list
|
||||
* 2: bloody branch list
|
||||
* flag:
|
||||
* &1: Apply the summon success chance found in the list.
|
||||
* &1: Apply the summon success chance found in the list (otherwise get any monster from the db)
|
||||
* &2: Apply a monster check level.
|
||||
* &4: Selected monster should not be a boss type
|
||||
* &8: Selected monster must give base exp.
|
||||
* lv: Mob level to check against
|
||||
*------------------------------------------
|
||||
*/
|
||||
|
||||
int mob_get_random_id(int type, int flag, int lv) {
|
||||
struct mob_db *mob;
|
||||
int i=0, k=0, class_;
|
||||
int i=0, class_;
|
||||
if(type < 0 || type >= MAX_RANDOMMONSTER) {
|
||||
if (battle_config.error_log)
|
||||
ShowError("mob_get_random_id: Invalid type (%d) of random monster.\n", type);
|
||||
@ -253,11 +255,14 @@ int mob_get_random_id(int type, int flag, int lv) {
|
||||
}
|
||||
do {
|
||||
class_ = rand() % MAX_MOB_DB;
|
||||
if (flag&1)
|
||||
k = rand() % 1000000;
|
||||
mob = mob_db(class_);
|
||||
} while ((mob == mob_dummy || mob->summonper[type] <= k ||
|
||||
(flag&2 && lv < mob->lv)) && (i++) < MAX_MOB_DB);
|
||||
} while ((mob == mob_dummy ||
|
||||
(flag&1 && mob->summonper[type] <= rand() % 1000000) ||
|
||||
(flag&2 && lv < mob->lv) ||
|
||||
(flag&4 && mob->status.mode&MD_BOSS) ||
|
||||
(flag&8 && mob->base_exp < 1)
|
||||
) && (i++) < MAX_MOB_DB);
|
||||
|
||||
if(i >= MAX_MOB_DB)
|
||||
class_ = mob_db_data[0]->summonper[type];
|
||||
return class_;
|
||||
@ -1738,7 +1743,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
||||
if (hp||sp)
|
||||
status_heal(src, hp, sp, battle_config.show_hp_sp_gain?2:0);
|
||||
if (sd->mission_mobid == md->class_) { //TK_MISSION [Skotlex]
|
||||
if (++sd->mission_count >= 100 && (temp = mob_get_random_id(0, 0, sd->status.base_level)))
|
||||
if (++sd->mission_count >= 100 && (temp = mob_get_random_id(0,0xC, sd->status.base_level)))
|
||||
{
|
||||
pc_addfame(sd, 1);
|
||||
sd->mission_mobid = temp;
|
||||
|
@ -6665,7 +6665,7 @@ int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data)
|
||||
sd=map_id2sd(id);
|
||||
if(sd==NULL)
|
||||
return 0;
|
||||
sd->pvp_timer=-1;
|
||||
sd->pvp_timer=UINT_MAX;
|
||||
if( pc_calc_pvprank(sd)>0 )
|
||||
sd->pvp_timer=add_timer(
|
||||
gettick()+PVP_CALCRANK_INTERVAL,
|
||||
|
@ -8671,36 +8671,33 @@ int buildin_pvpon(struct script_state *st)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int buildin_pvpoff_sub(struct block_list *bl,va_list ap) {
|
||||
TBL_PC* sd = (TBL_PC*)bl;
|
||||
clif_pvpset(sd, 0, 0, 2);
|
||||
if (sd->pvp_timer != UINT_MAX) {
|
||||
delete_timer(sd->pvp_timer, pc_calc_pvprank_timer);
|
||||
sd->pvp_timer = UINT_MAX;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int buildin_pvpoff(struct script_state *st)
|
||||
{
|
||||
int m,i,users;
|
||||
int m;
|
||||
char *str;
|
||||
struct map_session_data *pl_sd=NULL, **pl_allsd;
|
||||
|
||||
str=conv_str(st,& (st->stack->stack_data[st->start+2]));
|
||||
m = map_mapname2mapid(str);
|
||||
if(m >= 0 && map[m].flag.pvp) { //fixed Lupus
|
||||
map[m].flag.pvp = 0;
|
||||
clif_send0199(m,0);
|
||||
if(m < 0 || !map[m].flag.pvp)
|
||||
return 0; //fixed Lupus
|
||||
|
||||
if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
|
||||
return 0;
|
||||
|
||||
pl_allsd = map_getallusers(&users);
|
||||
|
||||
for(i=0;i<users;i++)
|
||||
{
|
||||
if((pl_sd=pl_allsd[i]) && m == pl_sd->bl.m)
|
||||
{
|
||||
clif_pvpset(pl_sd,0,0,2);
|
||||
if(pl_sd->pvp_timer != UINT_MAX) {
|
||||
delete_timer(pl_sd->pvp_timer,pc_calc_pvprank_timer);
|
||||
pl_sd->pvp_timer = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
map[m].flag.pvp = 0;
|
||||
clif_send0199(m,0);
|
||||
|
||||
if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
|
||||
return 0;
|
||||
|
||||
map_foreachinmap(buildin_pvpoff_sub, m, BL_PC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3832,7 +3832,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
||||
clif_skill_fail(sd,skillid,0,0);
|
||||
break;
|
||||
}
|
||||
id = mob_get_random_id(0,0, sd->status.base_level);
|
||||
id = mob_get_random_id(0,0xC, sd->status.base_level);
|
||||
if (!id) {
|
||||
clif_skill_fail(sd,skillid,0,0);
|
||||
break;
|
||||
|
@ -6057,6 +6057,7 @@ int status_change_end( struct block_list* bl , int type,int tid )
|
||||
//delays status change ending so that a skill that sets opt1 fails to
|
||||
//trigger when it also removed one
|
||||
case SC_STONE:
|
||||
sc->data[type].val3 = 0; //Petrify time counter.
|
||||
case SC_FREEZE:
|
||||
case SC_STUN:
|
||||
case SC_SLEEP:
|
||||
|
Loading…
x
Reference in New Issue
Block a user