As requested, zone can be levitate restricted.
Code changes:
1/ In zone.h,
after
Code:
bool CanDoCombat() const { return(can_combat); }
add
Code:
bool CanLevitate() const {return(can_levitate); }
after
add
In the file: zonedb.h,
replace
Code:
bool GetZoneCFG(int32 zoneid, NewZone_Struct *data, bool &can_bind, bool &can_combat);
by
Code:
bool GetZoneCFG(int32 zoneid, NewZone_Struct *data, bool &can_bind, bool &can_combat, bool &can_levitate);
In the file zone.cpp and in the function Zone::LoadZoneCFG,
replace
Code:
if(!database.GetZoneCFG(database.GetZoneID(filename), &newzone_data, can_bind, can_combat)) {
by
Code:
if(!database.GetZoneCFG(database.GetZoneID(filename), &newzone_data, can_bind, can_combat, can_levitate)) {
In the file zonedb.cpp,
replace
Code:
bool ZoneDatabase::GetZoneCFG(int32 zoneid, NewZone_Struct *zone_data, bool &can_bind, bool &can_combat) {
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int i=0;
bool good = false;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT ztype,"
"fog_red,fog_green,fog_blue,fog_minclip,fog_maxclip,"
"fog_red2,fog_green2,fog_blue2,fog_minclip2,fog_maxclip2,"
"fog_red3,fog_green3,fog_blue3,fog_minclip3,fog_maxclip3,"
"fog_red4,fog_green4,fog_blue4,fog_minclip4,fog_maxclip4,"
"sky,zone_exp_multiplier,safe_x,safe_y,safe_z,underworld,"
"minclip,maxclip,time_type,canbind,cancombat"
" from zone where zoneidnumber=%i",zoneid), errbuf, &result)) {
safe_delete_array(query);
while((row = mysql_fetch_row(result))) {
int r = 0;
memset(zone_data,0,sizeof(NewZone_Struct));
zone_data->ztype=atoi(row[r++]);
for(i=0;i<4;i++){
zone_data->fog_red[i]=atoi(row[r++]);
zone_data->fog_green[i]=atoi(row[r++]);
zone_data->fog_blue[i]=atoi(row[r++]);
zone_data->fog_minclip[i]=atof(row[r++]);
zone_data->fog_maxclip[i]=atof(row[r++]);
}
zone_data->sky=atoi(row[r++]);
zone_data->zone_exp_multiplier=atof(row[r++]);
zone_data->safe_x=atof(row[r++]);
zone_data->safe_y=atof(row[r++]);
zone_data->safe_z=atof(row[r++]);
zone_data->underworld=atof(row[r++]);
zone_data->minclip=atof(row[r++]);
zone_data->maxclip=atof(row[r++]);
zone_data->time_type=atoi(row[r++]);
//not in the DB yet:
zone_data->gravity = 0.4;
can_bind = atoi(row[r++])==0?false:true;
can_combat = atoi(row[r++])==0?false:true;
good = true;
}
mysql_free_result(result);
}
else
LogFile->write(EQEMuLog::Error, "Error in GetZoneCFG query %s: %s", query, errbuf);
safe_delete_array(query);
zone_data->zone_id = zoneid;
return(good);
}
by
Code:
bool ZoneDatabase::GetZoneCFG(int32 zoneid, NewZone_Struct *zone_data, bool &can_bind, bool &can_combat, bool &can_levitate) {
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int i=0;
bool good = false;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT ztype,"
"fog_red,fog_green,fog_blue,fog_minclip,fog_maxclip,"
"fog_red2,fog_green2,fog_blue2,fog_minclip2,fog_maxclip2,"
"fog_red3,fog_green3,fog_blue3,fog_minclip3,fog_maxclip3,"
"fog_red4,fog_green4,fog_blue4,fog_minclip4,fog_maxclip4,"
"sky,zone_exp_multiplier,safe_x,safe_y,safe_z,underworld,"
"minclip,maxclip,time_type,canbind,cancombat,canlevitate"
" from zone where zoneidnumber=%i",zoneid), errbuf, &result)) {
safe_delete_array(query);
while((row = mysql_fetch_row(result))) {
int r = 0;
memset(zone_data,0,sizeof(NewZone_Struct));
zone_data->ztype=atoi(row[r++]);
for(i=0;i<4;i++){
zone_data->fog_red[i]=atoi(row[r++]);
zone_data->fog_green[i]=atoi(row[r++]);
zone_data->fog_blue[i]=atoi(row[r++]);
zone_data->fog_minclip[i]=atof(row[r++]);
zone_data->fog_maxclip[i]=atof(row[r++]);
}
zone_data->sky=atoi(row[r++]);
zone_data->zone_exp_multiplier=atof(row[r++]);
zone_data->safe_x=atof(row[r++]);
zone_data->safe_y=atof(row[r++]);
zone_data->safe_z=atof(row[r++]);
zone_data->underworld=atof(row[r++]);
zone_data->minclip=atof(row[r++]);
zone_data->maxclip=atof(row[r++]);
zone_data->time_type=atoi(row[r++]);
//not in the DB yet:
zone_data->gravity = 0.4;
can_bind = atoi(row[r++])==0?false:true;
can_combat = atoi(row[r++])==0?false:true;
can_levitate = atoi(row[r++])==0?false:true;
good = true;
}
mysql_free_result(result);
}
else
LogFile->write(EQEMuLog::Error, "Error in GetZoneCFG query %s: %s", query, errbuf);
safe_delete_array(query);
zone_data->zone_id = zoneid;
return(good);
}
In the file spells.cpp, in the function Mob::SpellFinished(int16 spell_id, Mob *spell_target, int16 slot, int16 mana_used),
find
Code:
if(!IsValidSpell(spell_id))
return false;
and, add after
Code:
if( IsEffectInSpell(spell_id, SE_Levitate) && !zone->CanLevitate() )
{
if( IsClient() )
{
if(!CastToClient()->GetGM())
{
Message(13, "You can't levitate in this zone.");
return false;
}
}
}
In the file client_packet.cpp, function Complete_Connect(),
replace
Code:
case SE_Levitate:
{
SendAppearancePacket(AT_Levitate, 2);
break;
}
by
Code:
case SE_Levitate:
{
if( !zone->CanLevitate() )
{
if(!GetGM())
{
SendAppearancePacket(AT_Levitate, 0);
BuffFadeByEffect(SE_Levitate);
Message(13, "You can't levitate in this zone.");
}
}else{
SendAppearancePacket(AT_Levitate, 2);
}
break;
}
SQL changes:
Code:
alter table `zone` add column `canlevitate` tinyint (4) DEFAULT '1' NOT NULL after `cancombat`
I've tested it with the zone: The Hole.
It seems to work correctly.
Mag.