Go Back   EQEmulator Home > EQEmulator Forums > Support > Support::Windows Servers

Support::Windows Servers Support forum for Windows EQEMu users.

Reply
 
Thread Tools Display Modes
  #1  
Old 12-06-2013, 02:50 PM
Lucia Moore
Sarnak
 
Join Date: Sep 2013
Posts: 32
Smile Configuration questions for potential new server (huge post!)

Greetings, all!

I've just finished setting up my server, and it works like a charm, I can log in, kill monsters, the works. Now comes the really hard part: setting the server up the way I want.

I intend to run a roleplay-required server, and I plan to implement several restrictions and changes to the current EQ system.

Note: the first part of this post is a wall of text outlining my long-term plans. If you don't want to read them, skip to the actual configuration questions below!

Level Restriction: 20
I feel that capping levels at 20 still provides a good incentive to go out and adventure, but prevents the severe gap in abilities between newer players and older ones. I don't want to encounter situations where my players simply cannot compete just because someone else has been here longer.

Adjusted spells, mobs, and quests
Obviously, because of the lower level cap, a lot of things need to be adjusted to bring them in tune with the lower level cap. Specifically, new spells need to be made (and existing ones modified) to take the lower levels into consideration. Since most damage/healing spells are already scaled by level, it's mostly the utility spells that might need some tweaking.

Adjusted gear
I'm heavily influenced by games like Dungeons and Dragons (the PnP game, not the online ones) for my itemization. Player-based economy will still be present, but with the anticipated smaller community, armor and weapons purchased from NPC merchants will be both more affordable and more feasible to use. Platemail will still be expensive for someone that's not wealthy, but it won't cost in excess of 5,000pp like it does on live servers.

Weapons will also be more balanced as well. All one-handed weapons of a certain type (steel, bronze, etc) will, for example, have roughly the same DPS, leaving the decision more to one of preference rather than stats.

Shields will play a bigger role as well, enough that even dual-wielding classes may prefer to use them. I will find some way to make the defensive benefit of carrying a shield good enough that swapping to two weapons will actually carry some drawbacks to weigh against the benefits. Possibly a big boost to block chance.

Significantly Slower Experience Rate
I don't want the focus on my server to be solely on grinding, and will actually be handing out XP for good roleplay. Because of this, the XP rates for killing monsters and performing quests will be dramatically reduced. One can still grind to 20, but doing so will be tedious. Of course, to offset that, there will be plenty of things you can participate in even at level 1, and you're going to reach level 20 a lot faster by providing and participating in good roleplaying story-lines than you ever would simply grinding on monsters.

Classic EQ Only!
The available zones will be limited solely to Classic EQ. Given the roleplay nature of the server, I highly doubt that we'll ever have a strong push to open other expansions, but we'll see.

Server Whitelisting
To ensure that we only get players truly interested in roleplaying, the entire server will not be open to any and all players. Assuming I can manage it, players will arrive at a predetermined zone and be unable to leave that zone unless they first fill out an application that demonstrates they're actually interested in roleplaying. Hopefully, this will help weed out troublemakers and trolls (the idiot internet kind, not the ones from Grobb).

Realistic NPCs with improved AI
Assuming it can be done, NPCs will fight like real players. Their damage will be based on their current weapon, and they'll hit like a player of that level, too. Hopefully, I can also get help implementing AI that makes casters root melee and back off, snare kite, and other tactics that a PC might use in a fight. How effective this will be is still up in the air, as I myself am not a programmer and am not sure how feasible it is.

Broadened Race/Class Combination
There's no legitimate reason why a wood elf couldn't become a cleric, or why a, erudite couldn't pick up a sword and become a warrior, or why a barbarian couldn't commit himself to The Tribunal and become a paladin of Justice. My server will include NPCs that are capable of performing class changes for certain races, provided said character is still only level 1. That is, unless it's possible to easily modify those options at the client level. While this won't be an ALL/ALL option, the increased class variety will make a little more sense.

Now, the configuration questions!
Which of the following can be done by modifying server/database settings, and which ones require changes to the source code? Note that while I am not a professional programmer, I do have some experience with writing code and modifying existing code provided it's well-commented (as all code should be).

Things I already know can be done through the database:
  • Changing the XP rates.
  • Adjusting loot, items, loot tables, etc.
  • Changing player spawn locations.

Things I'm pretty sure can be done without modifying source code:
  • Setting the level limit to 20.
  • Removing PoK books and restricting players to classic zones only.

Things I'm not sure how to do:
  • Changing what level players get certain skills at (e.g. dual wield)
  • Changing the stats for spells (spells_us.txt?)
  • Disabling the /consider command. Obviously, players can find ways around that with MQ2 or UI changes, though.
  • Setting up an NPC that changes player classes upon request.

Things I'm almost positive require source code changes:
  • Changing how weapon damage/accuracy is calculated.
  • Removing the level-based modifier on combat/resists.
  • Changing how resistances are calculated.
  • Removing PvP damage reduction.
  • Providing racial benefits to some races (innate damage reduction, innate mana regen, racial run speed, etc).
  • Blocking /group chat, forcing players to always communicate via /say or /shout, making communications more realistic.
  • Limiting /shout maximum range. If possible, making it function like /yell would be nice too (e.g. Lucia shouts, 'Help! Someone help me!' from behind and to your left. )

Things I'm not even sure are possible:
  • Allowing players to select non-standard race/class combinations during character creation.

Basically, anyone that can provide any feedback, advice, or answer any of my questions, please feel free. I'm eager to get started, but I want to know what my possibilities and limitations are before I start making too many plans.
Reply With Quote
  #2  
Old 12-06-2013, 03:25 PM
chrsschb's Avatar
chrsschb
Dragon
 
Join Date: Nov 2008
Location: GA
Posts: 904
Default

Quote:
Originally Posted by Lucia Moore View Post
Things I'm pretty sure can be done without modifying source code:
  • Setting the level limit to 20. --Yup
  • Removing PoK books and restricting players to classic zones only. --Yup

Things I'm not sure how to do:
  • Changing what level players get certain skills at (e.g. dual wield) --Database and Local files: Skill_caps table, Class_skills tables, and SkillCaps.txt. If you plan to do alter AA levels that's in the database too
  • Changing the stats for spells (spells_us.txt?) -- I believe all spell data was moved into the database last year.
  • Disabling the /consider command. Obviously, players can find ways around that with MQ2 or UI changes, though. -- Not sure, never even thought about it.
  • Setting up an NPC that changes player classes upon request. -- Yup

Things I'm almost positive require source code changes:
  • Changing how weapon damage/accuracy is calculated. -- Source
  • Removing the level-based modifier on combat/resists. -- Some source, some database
  • Changing how resistances are calculated. -- Database
  • Removing PvP damage reduction. -- Source
  • Providing racial benefits to some races (innate damage reduction, innate mana regen, racial run speed, etc). -- Source, but there is probably a way to do it through script/database (pretty sure...)
  • Blocking /group chat, forcing players to always communicate via /say or /shout, making communications more realistic. -- Unsure. I know you can turn off global OOC in the database.
  • Limiting /shout maximum range. If possible, making it function like /yell would be nice too. -- Unsure

Things I'm not even sure are possible:
  • Allowing players to select non-standard race/class combinations during character creation. -- Database

Basically, anyone that can provide any feedback, advice, or answer any of my questions, please feel free. I'm eager to get started, but I want to know what my possibilities and limitations are before I start making too many plans.
See red text for answers
__________________
Clumsy's World: Resurgence [2019-Present]
Clumsy's World 2.0 [2014-2016]
Clumsy's World [2006-2012]
Reply With Quote
  #3  
Old 12-06-2013, 03:45 PM
demonstar55
Demi-God
 
Join Date: Apr 2008
Location: MA
Posts: 1,164
Default

Disabling consider you can just make Client::Handle_OP_Consider in zone/client_packet.cpp do nothing. And I don't think there is any way around this with MQ2, the client knows nothing of the mobs faction until the server responds to the OP_Consider packet. Disabling groups should be similar, I'm just not sure where in the source group chat is :P Same with the shout change.

KLS recently pushed changes that adds a base data table which also comes with a program to easily generate the SkillCaps.txt and other files after you change them in the database to distribute to players.

EDIT: In zone/client.cpp Client::ChannelMessageReceived is the function that would need to be edited for the chat changes I think :P
Reply With Quote
  #4  
Old 12-06-2013, 04:28 PM
rencro
Hill Giant
 
Join Date: Sep 2008
Location: So. California
Posts: 219
Default

Here is how I disable "tell, ooc, and auction", same priciple can be applied for group...

Code:
diff --git a/zone/client.cpp b/zone/client.cpp
index 533f8b5..750ff73 100644
--- a/zone/client.cpp
+++ b/zone/client.cpp
@@ -872,6 +872,9 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
 		break;
 	}
 	case 4: { // Auction
+		Message(13, "Auction is disabled."); //rencro
+			return;
+
 		if(RuleB(Chat, ServerWideAuction))
 		{
 			if(!global_channel_timer.Check())
@@ -911,6 +914,9 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
 		break;
 	}
 	case 5: { // OOC
+		Message(13, "OOC is disabled."); //rencro
+			return;
+
 		if(RuleB(Chat, ServerWideOOC))
 		{
 			if(!global_channel_timer.Check())
@@ -966,6 +972,9 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
 		break;
 	}
 	case 7: { // Tell
+		Message(13, "Tell system is disabled."); //rencro
+			return;
+
 			if(!global_channel_timer.Check())
 			{
 				if(strlen(targetname) == 0)
A lazy way of doing it but gets the job done..
Reply With Quote
  #5  
Old 12-06-2013, 04:33 PM
Lucia Moore
Sarnak
 
Join Date: Sep 2013
Posts: 32
Default

Responding to everyone here. (Thanks so much for the replies, by the way!)

Quote:
I believe all spell data was moved into the database last year.
Does that mean that I don't need to distribute any spell data files? Meaning, if I change a spell in my database, will it appear with the new stats, name, etc. on other peoples' clients when they play there, or do they still have to download something?

As for the things requiring source changes:

Some of those are pretty simple, right? Like, in the source for PvP damage mod, it must say somewhere something like "totalDamage * 0.66" or something similar, I assume, or maybe it's a constant defined somewhere like "PVP_DMG_MODIFIER" or something?

Quote:
Originally Posted by demonstar55 View Post
Disabling consider you can just make Client::Handle_OP_Consider in zone/client_packet.cpp do nothing. And I don't think there is any way around this with MQ2, the client knows nothing of the mobs faction until the server responds to the OP_Consider packet. Disabling groups should be similar, I'm just not sure where in the source group chat is :P Same with the shout change.

KLS recently pushed changes that adds a base data table which also comes with a program to easily generate the SkillCaps.txt and other files after you change them in the database to distribute to players.

EDIT: In zone/client.cpp Client::ChannelMessageReceived is the function that would need to be edited for the chat changes I think :P
My desire to remove /consider wasn't due to faction concerns, it's so that players cannot determine one anothers' levels. However, since level information still gets sent to clients, MQ2 can probably pull it using the ${Target.Level} variable. The Firiona Vie server on live had a modified /consider where people were either green (more than 5 below), white (within 5), or red (more than five over), and you could still pull their exact level using MQ2.

It's a minor concern, anyway. I intend to remove the effects of level on combat and spell resists, and with a cap of 20, level won't be as important as attributes, anyway. I hope to make it so that ATK, AC, and skills are the only factor in determining combat effectiveness.
Reply With Quote
  #6  
Old 12-06-2013, 04:35 PM
Lucia Moore
Sarnak
 
Join Date: Sep 2013
Posts: 32
Default

Quote:
Originally Posted by rencro View Post
Here is how I disable "tell, ooc, and auction", same priciple can be applied for group...

Code:
diff --git a/zone/client.cpp b/zone/client.cpp
index 533f8b5..750ff73 100644
--- a/zone/client.cpp
+++ b/zone/client.cpp
@@ -872,6 +872,9 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
 		break;
 	}
 	case 4: { // Auction
+		Message(13, "Auction is disabled."); //rencro
+			return;
+
 		if(RuleB(Chat, ServerWideAuction))
 		{
 			if(!global_channel_timer.Check())
@@ -911,6 +914,9 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
 		break;
 	}
 	case 5: { // OOC
+		Message(13, "OOC is disabled."); //rencro
+			return;
+
 		if(RuleB(Chat, ServerWideOOC))
 		{
 			if(!global_channel_timer.Check())
@@ -966,6 +972,9 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
 		break;
 	}
 	case 7: { // Tell
+		Message(13, "Tell system is disabled."); //rencro
+			return;
+
 			if(!global_channel_timer.Check())
 			{
 				if(strlen(targetname) == 0)
A lazy way of doing it but gets the job done..
Is that an entire .cpp file that I can just copy/paste into my source, or do I have to plug that in somewhere?

As I said, I know some things about programming, but I don't wanna FUBAR my code unless I can figure out where I FUBAR'd it at.
Reply With Quote
  #7  
Old 12-06-2013, 04:47 PM
rencro
Hill Giant
 
Join Date: Sep 2008
Location: So. California
Posts: 219
Default

Quote:
Realistic NPCs with improved AI
Assuming it can be done, NPCs will fight like real players. Their damage will be based on their current weapon, and they'll hit like a player of that level, too. Hopefully, I can also get help implementing AI that makes casters root melee and back off, snare kite, and other tactics that a PC might use in a fight. How effective this will be is still up in the air, as I myself am not a programmer and am not sure how feasible it is.
I use a combination of Xachary's is evil code, davood's shroud races, and mq2 to make "bot" characters with access level 100 that will pvp the players when they enter a certain zone, which is monitored via WorldWide emotes. This solves your "hit like a player" because they are players. I have one windows box setup with 6 wineq sessions with "stick" graphics and a minimalist eqclient.ini load on them, each of them a different race that is "evil" and can pvp any player that is not "evil", of course they "cheat because they have access to gm commands but all "npcs" cheat.... Still working on the quest files for this to make a chest spawn on the death of the "bot"..Its a big WIP....Only issue is when the server goes down I have to log all the "bots" back in. Eventually I want to make them act like bosses and have assistance from zone npcs against the players.../derail off
Reply With Quote
  #8  
Old 12-06-2013, 05:07 PM
rencro
Hill Giant
 
Join Date: Sep 2008
Location: So. California
Posts: 219
Default

Quote:
Originally Posted by Lucia Moore View Post
Is that an entire .cpp file that I can just copy/paste into my source, or do I have to plug that in somewhere?

As I said, I know some things about programming, but I don't wanna FUBAR my code unless I can figure out where I FUBAR'd it at.
Thats a diff with my changes that would modify your code, but you want it for groups so you would be better going into zone/client.cpp and making the edits there yourself...

A word of warning..Once you start modifying things, it will be a chore to keep up with the tip release, so you may need to draw a line in the sand and just work from your source exclusively and perhaps cherry pick any new releases to the code manually, if at all....

Any ways:
Code:
About line 743 of zone/client.cpp

void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_skill, const char* orig_message, const char* targetname) {
.
.
.
	case 2: { // GroupChat
		Raid* raid = entity_list.GetRaidByClient(this);
		if(raid) {
			raid->RaidGroupSay((const char*) message, this);
			break;
		}

		Group* group = GetGroup();
		if(group != nullptr) {
			group->GroupMessage(this,language,lang_skill,(const char*) message);
		}
		break;
	}
Not sure about the raid but could try this:
Code:
void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_skill, const char* orig_message, const char* targetname) {
.
.
.
	case 2: { // GroupChat
		Message(13, "Group chat disabled."); //remove group chat
			return;

                Raid* raid = entity_list.GetRaidByClient(this);
		if(raid) {
			raid->RaidGroupSay((const char*) message, this);
			break;
		}

		Group* group = GetGroup();
		if(group != nullptr) {
			group->GroupMessage(this,language,lang_skill,(const char*) message);
		}
		break;
	}
Then recompile and test. If you dont like the "Group chat is disabled message, then remove it -)
Reply With Quote
  #9  
Old 12-06-2013, 05:20 PM
Lucia Moore
Sarnak
 
Join Date: Sep 2013
Posts: 32
Default

I see. So, if I'm understanding this correctly, could I do something like this?

(Note that I can't actually see the code right now because I'm at work, so my exact syntax may be wrong)

Code:
{ // GroupChat
		Raid* raid = entity_list.GetRaidByClient(this);
		if(raid) {
			raid->Say(this,language,lang_skill,(const char*) message);
			break;
		}

		Group* group = GetGroup();
		if(group != nullptr) {
			group->Say(this,language,lang_skill,(const char*) message);
		}
		break;
In other words, just make it so that anything you say in /group comes out as /say instead?
Reply With Quote
  #10  
Old 12-06-2013, 05:22 PM
Lucia Moore
Sarnak
 
Join Date: Sep 2013
Posts: 32
Default

Quote:
Originally Posted by rencro View Post
I use a combination of Xachary's is evil code, davood's shroud races, and mq2 to make "bot" characters with access level 100 that will pvp the players when they enter a certain zone, which is monitored via WorldWide emotes. This solves your "hit like a player" because they are players. I have one windows box setup with 6 wineq sessions with "stick" graphics and a minimalist eqclient.ini load on them, each of them a different race that is "evil" and can pvp any player that is not "evil", of course they "cheat because they have access to gm commands but all "npcs" cheat.... Still working on the quest files for this to make a chest spawn on the death of the "bot"..Its a big WIP....Only issue is when the server goes down I have to log all the "bots" back in. Eventually I want to make them act like bosses and have assistance from zone npcs against the players.../derail off
That's an interesting idea, but far too excessive for me. Really, all I want is NPCs that behave a little more intelligently than normal. Chanters that mez extra targets, casters rooting attackers and then backing off, that sort of stuff.

The hitting part I can probably work around simply by setting their minimum/maximum damage to be roughly equal to whatever weapon I make them spawn with.
Reply With Quote
  #11  
Old 12-06-2013, 05:35 PM
rencro
Hill Giant
 
Join Date: Sep 2008
Location: So. California
Posts: 219
Default

Not as in that example as say is not a member of Raid or Group, but if you like you can repipe it through say, yes, there are actually few limits in what you can do, you just need to "do" it....

I went the lazy route by just disabling the feature and letting the players know it was disabled so they would use other methods, but re-writing it to use the current system as close as possible is also viable...
Reply With Quote
  #12  
Old 12-06-2013, 05:55 PM
lerxst2112
Demi-God
 
Join Date: Aug 2010
Posts: 1,742
Default

If you change spells you need to export the spell file from the database and distribute it to your players.
Reply With Quote
  #13  
Old 12-06-2013, 06:00 PM
demonstar55
Demi-God
 
Join Date: Apr 2008
Location: MA
Posts: 1,164
Default

If you're building with client files on (default is on) it could create import_client_files and export_client_files. With these tools you can now just edit the DB entries for spells, skill caps, and base data then run export_client_files and it should generate the files for you to distribute to users.

EDIT: make sure the export directory exists.
Reply With Quote
  #14  
Old 12-07-2013, 03:49 AM
Lucia Moore
Sarnak
 
Join Date: Sep 2013
Posts: 32
Default

Quote:
Originally Posted by demonstar55 View Post
If you're building with client files on (default is on) it could create import_client_files and export_client_files. With these tools you can now just edit the DB entries for spells, skill caps, and base data then run export_client_files and it should generate the files for you to distribute to users.

EDIT: make sure the export directory exists.
How do I run that, exactly? Where do I input the "export_client_files" command?
Reply With Quote
  #15  
Old 12-08-2013, 12:46 AM
chrsschb's Avatar
chrsschb
Dragon
 
Join Date: Nov 2008
Location: GA
Posts: 904
Default

Quote:
Originally Posted by Lucia Moore View Post
How do I run that, exactly? Where do I input the "export_client_files" command?
Per KLS:

Quote:
Originally Posted by KLS View Post
If you're using current upstream source (which it sounds like you are).

1) Put export_client_files.exe into your server directory. eg: C:/eqemu/export_client_files.exe
2) Create a directory "export" in your server directory. eg: C:/eqemu/export
3) Run export_client_files.exe.
4) All the files that export_client_files.exe works with will now be in the directory created.

Currently we export: spells, skills and base data. We don't yet work with race but if someone works it out I'm not against more of the files being officially exportable.
I just tried it and it worked.
__________________
Clumsy's World: Resurgence [2019-Present]
Clumsy's World 2.0 [2014-2016]
Clumsy's World [2006-2012]
Reply With Quote
Reply


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 11:36 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