* Changed all uses of struct skill_unit_group* to group_id in status_change_entry's. (last known 64bit portability issue)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13482 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
FlavioJS 2009-01-24 17:38:17 +00:00
parent 1a2d2c0d4e
commit 58e4991d42
6 changed files with 51 additions and 17 deletions

View File

@ -3,6 +3,8 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. 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. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2009/01/24
* Changed all uses of struct skill_unit_group* to group_id in status_change_entry's. [FlavioJS]
2009/01/23 2009/01/23
* Changed npc_get_new_npc_id to ensure that it never returns invalid/used ids. [FlavioJS] * Changed npc_get_new_npc_id to ensure that it never returns invalid/used ids. [FlavioJS]
- npc_get_new_npc_id is used to generate ids for npcs/mobs/homunculus/mercenaries/pets. - npc_get_new_npc_id is used to generate ids for npcs/mobs/homunculus/mercenaries/pets.

View File

@ -311,7 +311,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
if( sc->data[SC_SAFETYWALL] && (flag&(BF_SHORT|BF_MAGIC))==BF_SHORT ) if( sc->data[SC_SAFETYWALL] && (flag&(BF_SHORT|BF_MAGIC))==BF_SHORT )
{ {
struct skill_unit_group *group = (struct skill_unit_group *)sc->data[SC_SAFETYWALL]->val3; struct skill_unit_group* group = skill_id2group(sc->data[SC_SAFETYWALL]->val3);
if (group) { if (group) {
if (--group->val2<=0) if (--group->val2<=0)
skill_delunitgroup(NULL,group); skill_delunitgroup(NULL,group);

View File

@ -437,9 +437,9 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick)
if (sc->data[SC_CLOAKING]) if (sc->data[SC_CLOAKING])
skill_check_cloaking(bl, sc->data[SC_CLOAKING]); skill_check_cloaking(bl, sc->data[SC_CLOAKING]);
if (sc->data[SC_DANCING]) if (sc->data[SC_DANCING])
skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING]->val2, bl->m, x1-x0, y1-y0); skill_unit_move_unit_group(skill_id2group(sc->data[SC_DANCING]->val2), bl->m, x1-x0, y1-y0);
if (sc->data[SC_WARM]) if (sc->data[SC_WARM])
skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_WARM]->val4, bl->m, x1-x0, y1-y0); skill_unit_move_unit_group(skill_id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0);
} }
} }
} else } else

View File

@ -6042,7 +6042,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
case HW_GRAVITATION: case HW_GRAVITATION:
if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0))) if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0)))
sc_start4(src,type,100,skilllv,0,BCT_SELF,(int)sg,skill_get_time(skillid,skilllv)); sc_start4(src,type,100,skilllv,0,BCT_SELF,sg->group_id,skill_get_time(skillid,skilllv));
flag|=1; flag|=1;
break; break;
@ -6078,7 +6078,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
case SG_STAR_WARM: case SG_STAR_WARM:
skill_clear_unitgroup(src); skill_clear_unitgroup(src);
if ((sg = skill_unitsetting(src,skillid,skilllv,src->x,src->y,0))) if ((sg = skill_unitsetting(src,skillid,skilllv,src->x,src->y,0)))
sc_start4(src,type,100,skilllv,0,0,(int)sg,skill_get_time(skillid,skilllv)); sc_start4(src,type,100,skilllv,0,0,sg->group_id,skill_get_time(skillid,skilllv));
flag|=1; flag|=1;
break; break;
@ -6091,7 +6091,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
if (!sg) break; if (!sg) break;
if (sce) if (sce)
status_change_end(src,type,-1); //Was under someone else's Gospel. [Skotlex] status_change_end(src,type,-1); //Was under someone else's Gospel. [Skotlex]
sc_start4(src,type,100,skilllv,0,(int)sg,BCT_SELF,skill_get_time(skillid,skilllv)); sc_start4(src,type,100,skilllv,0,sg->group_id,BCT_SELF,skill_get_time(skillid,skilllv));
clif_skill_poseffect(src, skillid, skilllv, 0, 0, tick); // PA_GOSPEL music packet clif_skill_poseffect(src, skillid, skilllv, 0, 0, tick); // PA_GOSPEL music packet
} }
break; break;
@ -6620,7 +6620,7 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, short skilli
sd->skilllv_dance = skilllv; sd->skilllv_dance = skilllv;
} }
if ( if (
sc_start4(src, SC_DANCING, 100, skillid, (int)group, skilllv, sc_start4(src, SC_DANCING, 100, skillid, group->group_id, skilllv,
(group->state.song_dance&2?BCT_SELF:0), limit+1000) && (group->state.song_dance&2?BCT_SELF:0), limit+1000) &&
sd && group->state.song_dance&2 && skillid != CG_HERMODE //Hermod is a encore with a warp! sd && group->state.song_dance&2 && skillid != CG_HERMODE //Hermod is a encore with a warp!
) )
@ -6753,7 +6753,7 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
case UNT_SAFETYWALL: case UNT_SAFETYWALL:
//TODO: Find a more reliable way to handle the link to sg, this could cause dangling pointers. [Skotlex] //TODO: Find a more reliable way to handle the link to sg, this could cause dangling pointers. [Skotlex]
if (!sce) if (!sce)
sc_start4(bl,type,100,sg->skill_lv,sg->group_id,(int)sg,0,sg->limit); sc_start4(bl,type,100,sg->skill_lv,sg->group_id,sg->group_id,0,sg->limit);
break; break;
case UNT_PNEUMA: case UNT_PNEUMA:
@ -9423,7 +9423,7 @@ void skill_stop_dancing (struct block_list *src)
if(!sc->count || !(sce=sc->data[SC_DANCING])) if(!sc->count || !(sce=sc->data[SC_DANCING]))
return; return;
group = (struct skill_unit_group *)sce->val2; group = skill_id2group(sce->val2);
sce->val2 = 0; sce->val2 = 0;
if (sce->val4) if (sce->val4)
@ -9547,8 +9547,38 @@ int skill_delunit (struct skill_unit* unit)
/*========================================== /*==========================================
* *
*------------------------------------------*/ *------------------------------------------*/
static DBMap* group_db = NULL;// int group_id -> struct skill_unit_group*
/// Returns the target skill_unit_group or NULL if not found.
struct skill_unit_group* skill_id2group(int group_id)
{
return (struct skill_unit_group*)idb_get(group_db, group_id);
}
static int skill_unit_group_newid = MAX_SKILL_DB; static int skill_unit_group_newid = MAX_SKILL_DB;
/// Returns a new group_id that isn't being used in group_db.
/// Fatal error if nothing is available.
static int skill_get_new_group_id(void)
{
if( skill_unit_group_newid >= MAX_SKILL_DB && skill_id2group(skill_unit_group_newid) == NULL )
return skill_unit_group_newid++;// available
{// find next id
int base_id = skill_unit_group_newid;
while( base_id != ++skill_unit_group_newid )
{
if( skill_unit_group_newid < MAX_SKILL_DB )
skill_unit_group_newid = MAX_SKILL_DB;
if( skill_id2group(skill_unit_group_newid) == NULL )
return skill_unit_group_newid++;// available
}
// full loop, nothing available
ShowFatalError("skill_get_new_group_id: All ids are taken. Exiting...");
exit(1);
}
}
struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count, short skillid, short skilllv, int unit_id, int limit, int interval) struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count, short skillid, short skilllv, int unit_id, int limit, int interval)
{ {
struct unit_data* ud = unit_bl2ud( src ); struct unit_data* ud = unit_bl2ud( src );
@ -9581,7 +9611,7 @@ struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count,
group->src_id = src->id; group->src_id = src->id;
group->party_id = status_get_party_id(src); group->party_id = status_get_party_id(src);
group->guild_id = status_get_guild_id(src); group->guild_id = status_get_guild_id(src);
group->group_id = skill_unit_group_newid++; group->group_id = skill_get_new_group_id();
group->unit = (struct skill_unit *)aCalloc(count,sizeof(struct skill_unit)); group->unit = (struct skill_unit *)aCalloc(count,sizeof(struct skill_unit));
group->unit_count = count; group->unit_count = count;
group->alive_count = 0; group->alive_count = 0;
@ -9599,12 +9629,10 @@ struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count,
ud->skillunit[i] = group; ud->skillunit[i] = group;
if(skill_unit_group_newid<=0)
skill_unit_group_newid = MAX_SKILL_DB;
if (skillid == PR_SANCTUARY) //Sanctuary starts healing +1500ms after casted. [Skotlex] if (skillid == PR_SANCTUARY) //Sanctuary starts healing +1500ms after casted. [Skotlex]
group->tick += 1500; group->tick += 1500;
idb_put(group_db, group->group_id, group);
return group; return group;
} }
@ -9672,6 +9700,7 @@ int skill_delunitgroup (struct block_list *src, struct skill_unit_group *group)
} }
map_freeblock(&group->unit->bl); map_freeblock(&group->unit->bl);
idb_remove(group_db, group->group_id);
group->unit=NULL; group->unit=NULL;
group->group_id=0; group->group_id=0;
group->unit_count=0; group->unit_count=0;
@ -11304,6 +11333,7 @@ int do_init_skill (void)
skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY, 0); skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY, 0);
skill_readdb(); skill_readdb();
group_db = idb_alloc(DB_OPT_BASE);
skill_unit_ers = ers_new(sizeof(struct skill_unit_group)); skill_unit_ers = ers_new(sizeof(struct skill_unit_group));
skill_timer_ers = ers_new(sizeof(struct skill_timerskill)); skill_timer_ers = ers_new(sizeof(struct skill_timerskill));
@ -11321,6 +11351,7 @@ int do_init_skill (void)
int do_final_skill(void) int do_final_skill(void)
{ {
db_destroy(skilldb_name2id); db_destroy(skilldb_name2id);
db_destroy(group_db);
ers_destroy(skill_unit_ers); ers_destroy(skill_unit_ers);
ers_destroy(skill_timer_ers); ers_destroy(skill_timer_ers);
return 0; return 0;

View File

@ -266,6 +266,7 @@ int skill_blown(struct block_list* src, struct block_list* target, int count, in
int skill_break_equip(struct block_list *bl, unsigned short where, int rate, int flag); int skill_break_equip(struct block_list *bl, unsigned short where, int rate, int flag);
int skill_strip_equip(struct block_list *bl, unsigned short where, int rate, int lv, int time); int skill_strip_equip(struct block_list *bl, unsigned short where, int rate, int lv, int time);
// ユニットスキル // ユニットスキル
struct skill_unit_group* skill_id2group(int group_id);
struct skill_unit_group *skill_unitsetting(struct block_list* src, short skillid, short skilllv, short x, short y, int flag); struct skill_unit_group *skill_unitsetting(struct block_list* src, short skillid, short skilllv, short x, short y, int flag);
struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, int x, int y, int val1, int val2); struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, int x, int y, int val1, int val2);
int skill_delunit(struct skill_unit *unit); int skill_delunit(struct skill_unit *unit);

View File

@ -692,7 +692,7 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
} }
if ((sce=sc->data[SC_GRAVITATION]) && sce->val3 == BCT_SELF) if ((sce=sc->data[SC_GRAVITATION]) && sce->val3 == BCT_SELF)
{ {
struct skill_unit_group *sg = (struct skill_unit_group *)sce->val4; struct skill_unit_group* sg = skill_id2group(sce->val4);
if (sg) { if (sg) {
skill_delunitgroup(target,sg); skill_delunitgroup(target,sg);
sce->val4 = 0; sce->val4 = 0;
@ -6602,7 +6602,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
struct skill_unit_group *group; struct skill_unit_group *group;
if(sce->val2) if(sce->val2)
{ {
group = (struct skill_unit_group *)sce->val2; group = skill_id2group(sce->val2);
sce->val2 = 0; sce->val2 = 0;
skill_delunitgroup(bl, group); skill_delunitgroup(bl, group);
} }
@ -6691,7 +6691,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
break; break;
case SC_GOSPEL: case SC_GOSPEL:
if (sce->val3) { //Clear the group. if (sce->val3) { //Clear the group.
struct skill_unit_group *group = (struct skill_unit_group *)sce->val3; struct skill_unit_group* group = skill_id2group(sce->val3);
sce->val3 = 0; sce->val3 = 0;
skill_delunitgroup(bl, group); skill_delunitgroup(bl, group);
} }
@ -6708,7 +6708,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
break; break;
case SC_WARM: case SC_WARM:
if (sce->val4) { //Clear the group. if (sce->val4) { //Clear the group.
struct skill_unit_group *group = (struct skill_unit_group *)sce->val4; struct skill_unit_group* group = skill_id2group(sce->val4);
sce->val4 = 0; sce->val4 = 0;
skill_delunitgroup(bl, group); skill_delunitgroup(bl, group);
} }