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)

Reply
 
Thread Tools Display Modes
  #1  
Old 01-19-2008, 02:50 AM
Bulle
Hill Giant
 
Join Date: Jan 2008
Posts: 102
Default Cvs Diff part 1

Code:
? output.diff
? Source/common/default_Hooks.cpp
? Source/common/default_Hooks.h
Index: Source/common/rulesys.cpp
===================================================================
RCS file: /cvsroot/eqemulator/EQEmuCVS/Source/common/rulesys.cpp,v
retrieving revision 1.2.2.2
diff -u -b -B -r1.2.2.2 rulesys.cpp
--- Source/common/rulesys.cpp	31 Oct 2006 02:02:54 -0000	1.2.2.2
+++ Source/common/rulesys.cpp	19 Jan 2008 13:37:36 -0000
@@ -20,7 +20,10 @@
 #include "logsys.h"
 #include "database.h"
 #include "MiscFunctions.h"
-
+#ifndef    WIN32
+/* On Linux, include the headers for libdl for dynamic library loading */
+#include <dlfcn.h>
+#endif /* !WIN32 */
 /*
 
  FatherNitwit: Added new rules subsystem to allow game rules to be changed       
@@ -73,7 +76,7 @@
 	"InvalidCategory"
 };
 
-const RuleManager::RuleInfo RuleManager::s_RuleInfo[_IntRuleCount+_RealRuleCount+_BoolRuleCount+1] = {
+const RuleManager::RuleInfo RuleManager::s_RuleInfo[_IntRuleCount+_RealRuleCount+_BoolRuleCount+_HookRuleCount+1] = {
     /* this is done in three steps so we can reliably get to them by index*/
 	#define RULE_INT(cat, rule, default_value) \
 		{ #cat ":" #rule, Category__##cat, IntRule,  Int__##rule  },
@@ -84,6 +87,9 @@
 	#define RULE_BOOL(cat, rule, default_value) \
 		{ #cat ":" #rule, Category__##cat, BoolRule, Bool__##rule },
 	#include "ruletypes.h"
+	#define RULE_HOOK(cat, rule, default_value) \
+		{ #cat ":" #rule, Category__##cat, HookRule, Hook__##rule },
+	#include "ruletypes.h"
 	{ "Invalid Rule", _CatCount, IntRule }
 };
 
@@ -149,6 +155,56 @@
 		m_RuleRealValues[index] = atof(rule_value);
 		_log(RULES__CHANGE, "Set rule %s to value %.13f", rule_name, m_RuleRealValues[index]);
 		break;
+	case HookRule:
+	{	char *fLibraryName = NULL, *fFunctionName = NULL;
+		Hook ThisHook = NULL;
+		const char *Colon = strchr(rule_value, ':');
+		if(Colon == NULL)
+			_log(RULES__ERROR, "Badly-formed hook value '%s' (rule '%s'). It must contain a colon (:). Ignoring this hook", rule_value, rule_name);
+		else
+		{	fLibraryName = (char *) malloc(Colon - rule_value + 128 + 1); /* 128 = let's assume it is more than enough to append a file extension to the library if needed */
+				strncpy(fLibraryName, rule_value, Colon - rule_value); fLibraryName[Colon - rule_value] = '\0';
+		 	fFunctionName = (char *) malloc(strlen(rule_value) - (Colon - rule_value + 1) + 1);
+				strcpy(fFunctionName, Colon + 1);
+		}
+#ifdef    WIN32
+		HMODULE ThisLibrary = NULL;
+		if(fLibraryName != NULL)
+		{	strcat(fLibraryName, ".dll");
+			ThisLibrary = LoadLibrary(fLibraryName);
+			if(ThisLibrary == NULL)
+				_log(RULES__ERROR, "Cannot load library '%s' needed by hook '%s' (rule '%s'). Ignoring this hook", fLibraryName, rule_value, rule_name);
+		}
+
+		if(ThisLibrary != NULL)
+		{	ThisHook = GetProcAddress(ThisLibrary, fFunctionName);
+			if(ThisHook == NULL)
+				_log(RULES__ERROR, "Cannot load library function '%s' needed by hook '%s' (rule '%s'). Ignoring this hook", fFunctionName, rule_value, rule_name);
+		}
+#else  /* WIN32 */
+		void *ThisLibrary = NULL;
+		if(fLibraryName != NULL)
+		{	strcat(fLibraryName, ".so");
+			ThisLibrary = dlopen(fLibraryName, RTLD_NOW | RTLD_GLOBAL);
+			if(ThisLibrary == NULL)
+				_log(RULES__ERROR, "Cannot load library '%s' needed by hook '%s' (rule '%s'). Ignoring this hook", fLibraryName, rule_value, rule_name);
+		}
+
+		if(ThisLibrary != NULL)
+		{	ThisHook = dlsym(ThisLibrary, fFunctionName);
+			if(ThisHook == NULL)
+				_log(RULES__ERROR, "Cannot load library function '%s' needed by hook '%s' (rule '%s'). Ignoring this hook", fFunctionName, rule_value, rule_name);
+		}
+		/*_log(RULES__ERROR, "The rule hooks are not yet implemented on this platform. Ignoring hook '%s' for fule '%s'", rule_value, rule_name);*/
+#endif /* WIN32 */
+		if(ThisHook != NULL)
+		{	m_RuleHookValues[index] = ThisHook;
+			_log(RULES__CHANGE, "Set rule %s to value %d", rule_name, (int) m_RuleHookValues[index]);
+		}
+		if(fLibraryName != NULL)	{	free(fLibraryName); fLibraryName = NULL; }
+		if(fFunctionName != NULL)	{	free(fFunctionName); fFunctionName = NULL; }
+		break;
+	}
 	case BoolRule:
 		bool val = false;
 		if(!strcasecmp(rule_value, "on") || !strcasecmp(rule_value, "true") || !strcasecmp(rule_value, "yes") || !strcasecmp(rule_value, "enabled") || !strcmp(rule_value, "1"))
@@ -172,6 +228,8 @@
 		m_RuleRealValues[ Real__##rule ] = default_value;
 	#define RULE_BOOL(cat, rule, default_value) \
 		m_RuleBoolValues[ Bool__##rule ] = default_value;
+	#define RULE_HOOK(cat, rule, default_value) \
+		m_RuleHookValues[ Hook__##rule ] = default_value;
 	#include "ruletypes.h"
 }
 
@@ -202,6 +260,8 @@
 		return(s_RuleInfo[index+_IntRuleCount].name);
 	case BoolRule:
 		return(s_RuleInfo[index+_IntRuleCount+_RealRuleCount].name);
+	case HookRule:
+		return(s_RuleInfo[index+_IntRuleCount+_RealRuleCount+_BoolRuleCount].name);
 	}
 	//should never happen
 	return("InvalidRule??");
@@ -236,6 +296,9 @@
 	for(r = 0; r < _BoolRuleCount; r++) {
 		_SaveRule(db, BoolRule, r);
 	}
+	for(r = 0; r < _HookRuleCount; r++) {
+		_SaveRule(db, HookRule, r);
+	}
 }
 
 
@@ -280,7 +343,10 @@
 void RuleManager::_SaveRule(Database *db, RuleType type, uint16 index) {
 	char vstr[16];
 
-	switch(type) {
+	if(type == HookRule)
+		_log(RULES__ERROR, "Impossible to save hook rule %s in the database. Hook rule saving is not supported", _GetRuleName(type, index));
+	else
+	{	switch(type) {
 	case IntRule:
 		sprintf(vstr, "%d", m_RuleIntValues[index]);
 		break;
@@ -302,6 +368,7 @@
 		_log(RULES__ERROR, "Fauled to set rule in the database: %s: %s", query,errbuf);
 	}
 	safe_delete_array(query);
+	}
 }
 
 
Index: Source/common/rulesys.h
===================================================================
RCS file: /cvsroot/eqemulator/EQEmuCVS/Source/common/rulesys.h,v
retrieving revision 1.2.2.2
diff -u -b -B -r1.2.2.2 rulesys.h
--- Source/common/rulesys.h	31 Oct 2006 02:02:54 -0000	1.2.2.2
+++ Source/common/rulesys.h	19 Jan 2008 10:07:13 -0000
@@ -35,6 +35,8 @@
 	rules->GetRealRule( RuleManager::Real__##rule )
 #define RuleB(cat, rule) \
 	rules->GetBoolRule( RuleManager::Bool__##rule )
+#define RuleH(cat, rule) \
+	rules->GetHookRule( RuleManager::Hook__##rule )
 
 
 #include <vector>
@@ -42,6 +44,7 @@
 #include <map>
 
 #include "types.h"
+#include "../common/default_Hooks.h"
 
 class Database;
 
@@ -70,6 +73,13 @@
 	} BoolType;
 
 	typedef enum {
+	#define RULE_HOOK(cat, rule, default_value) \
+		Hook__##rule,
+	#include "ruletypes.h"
+		_HookRuleCount
+	} HookType;
+
+	typedef enum {
 	#define RULE_CATEGORY(catname) \
 		Category__##catname,
 	#include "ruletypes.h"
@@ -79,9 +89,10 @@
 	static const IntType  InvalidInt  = _IntRuleCount;
 	static const RealType InvalidReal = _RealRuleCount;
 	static const BoolType InvalidBool = _BoolRuleCount;
+	static const HookType InvalidHook = _HookRuleCount;
 	static const CategoryType InvalidCategory = _CatCount;
 	
-	static const uint32 _RulesCount = _IntRuleCount+_RealRuleCount+_BoolRuleCount;
+	static const uint32 _RulesCount = _IntRuleCount+_RealRuleCount+_BoolRuleCount+_HookRuleCount;
 
 	RuleManager();
 	
@@ -89,11 +100,13 @@
 	inline int   GetIntRule (IntType  t) const { return(m_RuleIntValues[t] ); }
 	inline float GetRealRule(RealType t) const { return(m_RuleRealValues[t]); }
 	inline bool  GetBoolRule(BoolType t) const { return(m_RuleBoolValues[t]); }
+	inline Hook  GetHookRule(HookType t) const { return(m_RuleHookValues[t]); }
 
 	//management routines
 	static const char *GetRuleName(IntType  t) { return(s_RuleInfo[t].name); }
 	static const char *GetRuleName(RealType t) { return(s_RuleInfo[t+_IntRuleCount].name); }
 	static const char *GetRuleName(BoolType t) { return(s_RuleInfo[t+_IntRuleCount+_RealRuleCount].name); }
+	static const char *GetRuleName(HookType t) { return(s_RuleInfo[t+_IntRuleCount+_RealRuleCount+_BoolRuleCount].name); }
 	static uint32 CountRules() { return(_RulesCount); }
 	static CategoryType FindCategory(const char *catname);
 	bool ListRules(const char *catname, std::vector<const char *> &into);
@@ -117,11 +130,13 @@
 	int 	m_RuleIntValues [_IntRuleCount ];
 	float	m_RuleRealValues[_RealRuleCount];
 	bool	m_RuleBoolValues[_BoolRuleCount];
+	Hook	m_RuleHookValues[_HookRuleCount];
 
 	typedef enum {
 		IntRule,
 		RealRule,
-		BoolRule
+		BoolRule,
+		HookRule
 	} RuleType;
 	
 	static bool _FindRule(const char *rule_name, RuleType &type_into, uint16 &index_into);
Index: Source/common/ruletypes.h
===================================================================
RCS file: /cvsroot/eqemulator/EQEmuCVS/Source/common/ruletypes.h,v
retrieving revision 1.3.2.8
diff -u -b -B -r1.3.2.8 ruletypes.h
--- Source/common/ruletypes.h	21 Feb 2007 16:04:19 -0000	1.3.2.8
+++ Source/common/ruletypes.h	19 Jan 2008 12:42:10 -0000
@@ -13,6 +13,9 @@
 #ifndef RULE_BOOL
 #define RULE_BOOL(cat, rule, default_value)
 #endif
+#ifndef RULE_HOOK
+#define RULE_HOOK(cat, rule, default_value)
+#endif
 #ifndef RULE_CATEGORY_END
 #define RULE_CATEGORY_END()
 #endif
@@ -71,10 +74,16 @@
 RULE_REAL ( Combat, ClientBaseCritChance, 0.0 ) //The base crit chance for all clients, this will stack with warrior's/zerker's crit chance.
 RULE_CATEGORY_END()
 
+RULE_CATEGORY( CharacterCreation )
+RULE_HOOK ( CharacterCreation, ChangeCreationInfo, (Hook) default_CharacterCreation_ChangeCreationInfo )
+RULE_CATEGORY_END()
+
+
 #undef RULE_CATEGORY
 #undef RULE_INT
 #undef RULE_REAL
 #undef RULE_BOOL
+#undef RULE_HOOK
 #undef RULE_CATEGORY_END
Reply With Quote
  #2  
Old 01-19-2008, 02:51 AM
Bulle
Hill Giant
 
Join Date: Jan 2008
Posts: 102
Default CVS DIFF Part 2

Code:
Index: Source/world/client.cpp
===================================================================
RCS file: /cvsroot/eqemulator/EQEmuCVS/Source/world/client.cpp,v
retrieving revision 1.12.2.20
diff -u -b -B -r1.12.2.20 client.cpp
--- Source/world/client.cpp	22 Nov 2006 14:03:34 -0000	1.12.2.20
+++ Source/world/client.cpp	19 Jan 2008 09:19:57 -0000
@@ -907,6 +907,8 @@
 		return false;
 	}
 
+	((Hook_CharacterCreation_ChangeCreationInfo) RuleH(CharacterCreation, ChangeCreationInfo))(cc);
+
 	// Convert incoming cc_s to the new PlayerProfile_Struct
 	memset(&pp, 0, sizeof(PlayerProfile_Struct));	// start building the profile
 	
Index: Source/world/makefile.common
===================================================================
RCS file: /cvsroot/eqemulator/EQEmuCVS/Source/world/makefile.common,v
retrieving revision 1.1.2.6
diff -u -b -B -r1.1.2.6 makefile.common
--- Source/world/makefile.common	31 Oct 2006 02:02:54 -0000	1.1.2.6
+++ Source/world/makefile.common	19 Jan 2008 13:37:36 -0000
@@ -24,7 +24,7 @@
    ../common/SocketLib/HttpdForm.o ../common/SocketLib/HttpdSocket.o \
    ../common/SocketLib/MemFile.o ../common/SocketLib/Mime.o \
    ../common/SocketLib/Parse.o ../common/SocketLib/Utility.o \
-   ../common/guild_base.o wguild_mgr.o ../common/rulesys.o
+   ../common/guild_base.o wguild_mgr.o ../common/rulesys.o ../common/default_Hooks.cpp
 
 all: $(APP)
 
Index: Source/zone/makefile.common
===================================================================
RCS file: /cvsroot/eqemulator/EQEmuCVS/Source/zone/makefile.common,v
retrieving revision 1.2.2.12
diff -u -b -B -r1.2.2.12 makefile.common
--- Source/zone/makefile.common	18 Jul 2006 05:04:49 -0000	1.2.2.12
+++ Source/zone/makefile.common	19 Jan 2008 13:37:36 -0000
@@ -30,7 +30,7 @@
    ../common/EQStreamIdent.o ../common/patches/Live.o \
    zone_logsys.o ../common/BasePacket.o ../common/worldconn.o \
    ../common/EmuTCPConnection.o ../common/EmuTCPServer.o ../common/TCPServer.o \
-   ../common/guild_base.o guild_mgr.o
+   ../common/guild_base.o guild_mgr.o ../common/default_Hooks.cpp
 
 
 all: $(APP)
Reply With Quote
Reply

Thread Tools
Display Modes

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 02:59 AM.


 

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