Go Back   EQEmulator Home > EQEmulator Forums > Development > Development::Development

Development::Development Forum for development topics and for those interested in EQEMu development. (Not a support forum)

 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
  #1  
Old 12-20-2006, 03:41 PM
WildcardX
Developer
 
Join Date: Apr 2003
Posts: 589
Default A Fix for Zone Weather and New No KIll Feature

I have a fix for the weather in zones. This will prevent it from raining in dungeons that have no weather and the weather will only be the weather the zone weather column specifies, else it will be a clear blue day!

I also have implemented a feature that will allow server ops to prevent players from engaging in combat in specified zones. Plane of Knowledge, for example, is not a zone that allows combat.

I have tested the following code myself and it appears to work as I expected. Please integrate this code with the server's CVS code base. Thanks!

Code:
diff -u c:\temp\old/aggro.cpp c:\temp\new/aggro.cpp
--- c:\temp\old/aggro.cpp	2006-10-30 21:04:24.000000000 -0600
+++ c:\temp\new/aggro.cpp	2006-12-20 18:29:51.937500000 -0600
@@ -28,6 +28,8 @@
 #include "StringIDs.h"
 #include <iostream>
 
+//extern Zone* zone;
+
 //#define LOSDEBUG 6
 
 //look around a client for things which might aggro the client.
@@ -427,6 +429,9 @@
 //	NPC *npc1, *npc2;
 	int reverse;
 
+	if(!zone->CanDoCombat())
+		return false;
+
 	// some special cases
 	if(!target)
 		return false;
diff -u c:\temp\old/zone.cpp c:\temp\new/zone.cpp
--- c:\temp\old/zone.cpp	2006-11-29 00:17:06.000000000 -0600
+++ c:\temp\new/zone.cpp	2006-12-20 21:17:44.890625000 -0600
@@ -149,10 +149,22 @@
 
 	//This is a bad way of making it set the type to clear on bootup.
 	int8 weather=database.GetZoneWeather(zone->GetZoneID());
+	
+	/*
 	if(weather<1 || weather>3)
 		zone->weather_type=1;
 	else
 		zone->weather_type=weather;
+	*/
+
+	if(weather)
+	{
+		if(weather < 0 || weather > 3)
+			zone->weather_type = 0;
+		else
+			zone->weather_type = weather;
+	}
+
 	LogFile->write(EQEMuLog::Debug, "Default weather for zone is:%i", zone->weather_type);
 	return true;
 }
@@ -667,7 +679,7 @@
 	Weather_Timer = new Timer(((rand()%7200-30)+30)*2000);
 	Weather_Timer->Start();
 	LogFile->write(EQEMuLog::Status, "Weather should change in %i seconds",Weather_Timer->GetRemainingTime()/1000);
-	weather_type = 1;
+	weather_type = 0;
 	zone_weather = 0;
 	
 	aas = NULL;
@@ -878,7 +890,7 @@
 
 bool Zone::LoadZoneCFG(const char* filename, bool DontLoadDefault) {
 	memset(&newzone_data, 0, sizeof(NewZone_Struct));
-	if(!database.GetZoneCFG(database.GetZoneID(filename), &newzone_data, can_bind)) {
+	if(!database.GetZoneCFG(database.GetZoneID(filename), &newzone_data, can_bind, can_combat)) {
 		cout << "Error while loading Zone Config!\n";
 		cout << "IF YOU HAVENT DONE SO, SOURCE THE ZONECFG.SQL FILE!!!!!!\n";
 		return false;
@@ -1020,33 +1032,40 @@
 		guildwars.Update();
 #endif
 	
-	if(Weather_Timer->Check()){
+	if(Weather_Timer->Check())
+	{
 		Weather_Timer->Disable();
 		int16 tmpweather =rand()%100;
-		int8 type=weather_type-1;
-		//0 normal, 1 rainy, 2 snowy
-		if(type!=2){
-			if(zone_weather==type && tmpweather>80)
-				zone_weather=2;
-			else if(zone_weather==type)
-				zone_weather=type+1;
-			else
-				zone_weather=type; //default to zones default
-		}
-		else{
-			if(zone_weather==2 && tmpweather>80)
-				zone_weather=1;
-			else if(zone_weather==2)
-				zone_weather=0;
-			else
-				zone_weather=2; //default to zones default
+
+		if(weather_type != 0)
+		{
+			if(tmpweather)
+			{
+				if(tmpweather > 80)
+				{
+					// A change in the weather....
+					int8 tmpOldWeather = zone_weather;
+
+					if(zone_weather == 0)
+						zone_weather = weather_type;
+					else
+						zone_weather = 0;
+
+					LogFile->write(EQEMuLog::Debug, "The weather has changed. Old weather was = %i. New weather is = %i", tmpOldWeather, zone_weather);
+				}
+				else
+					LogFile->write(EQEMuLog::Debug, "The weather is not going to change. Chance was = %i\%", tmpweather);
+			}
 		}
+
 		this->weatherSend();
 		safe_delete(Weather_Timer);
-		if(zone_weather==type) //stopping, reset to large timer
+		
+		if(zone_weather==weather_type) //stopping, reset to large timer
 			Weather_Timer= new Timer(((rand()%(7170))+30)*2000);
 		else
 			Weather_Timer= new Timer(((rand()%(570))+30)*1000);
+		
 		Weather_Timer->Start();
 		LogFile->write(EQEMuLog::Status, "Weather should change in %i seconds",Weather_Timer->GetRemainingTime()/1000);
 	}
@@ -1761,3 +1780,5 @@
 	entity_list.QueueClients(0, outapp);
 	safe_delete(outapp);
 }
+
+
diff -u c:\temp\old/zone.h c:\temp\new/zone.h
--- c:\temp\old/zone.h	2006-10-15 15:48:20.000000000 -0500
+++ c:\temp\new/zone.h	2006-12-20 18:29:30.734375000 -0600
@@ -161,6 +161,7 @@
 	void	weatherProc();
 	void	weatherSend();
 	bool	CanBind() const { return(can_bind); }
+	bool	CanDoCombat() const { return(can_combat); }
 	
 	time_t	weather_timer;
 	int8	weather_type;
@@ -192,6 +193,7 @@
 	float	psafe_x, psafe_y, psafe_z;
 	int32	pMaxClients;
 	bool	can_bind;
+	bool	can_combat;
 	
 	int		totalAAs;
 	SendAA_Struct **aas;	//array of AA structs
diff -u c:\temp\old/zonedb.cpp c:\temp\new/zonedb.cpp
--- c:\temp\old/zonedb.cpp	2006-12-01 22:41:48.000000000 -0600
+++ c:\temp\new/zonedb.cpp	2006-12-20 13:25:27.952801600 -0600
@@ -75,7 +75,7 @@
 	return true;
 }
 
-bool ZoneDatabase::GetZoneCFG(int32 zoneid, NewZone_Struct *zone_data, bool &can_bind) {
+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;
@@ -88,7 +88,7 @@
 		"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"
+		"minclip,maxclip,time_type,canbind,cancombat"
 		" from zone where zoneidnumber=%i",zoneid), errbuf, &result)) {
 		safe_delete_array(query);
 		while((row = mysql_fetch_row(result))) {
@@ -118,6 +118,7 @@
 			zone_data->gravity = 0.4;
 			
 			can_bind = atoi(row[r++])==0?false:true;
+			can_combat = atoi(row[r++])==0?false:true;
 			
 			good = true;
 		}
diff -u c:\temp\old/zonedb.h c:\temp\new/zonedb.h
--- c:\temp\old/zonedb.h	2006-12-01 22:41:48.000000000 -0600
+++ c:\temp\new/zonedb.h	2006-12-20 18:12:55.125000000 -0600
@@ -149,7 +149,7 @@
 	/*
 	 * Zone related
 	 */
-	bool GetZoneCFG(int32 zoneid, NewZone_Struct *data, bool &can_bind);
+	bool GetZoneCFG(int32 zoneid, NewZone_Struct *data, bool &can_bind, bool &can_combat);
 	bool	SaveZoneCFG(int32 zoneid,NewZone_Struct* zd);
 	bool	DumpZoneState();
 	sint8	LoadZoneState(const char* zonename, LinkedList<Spawn2*>& spawn2_list);
And the following SQL is necessary for the code above....

Code:
ALTER TABLE `zone` ADD `cancombat` tinyint(4) NOT NULL default '1';
UPDATE `zone` SET `cancombat` = 0 WHERE short_name = 'nexus';
UPDATE `zone` SET `cancombat` = 0 WHERE short_name = 'poknowledge';
UPDATE `zone` SET `cancombat` = 0 WHERE short_name = 'potranquility';
Enjoy!
__________________
Read my developer notes at my blog.

Quote:
If it's not on IRC, it ain't l33t!
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 12:32 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3