Browse Source

Started implementation on PVP faction checks (IE Qeynos Players cannot inspect Freport Players currently). Implemented Alignment check based on Bind Location.

Devn00b 1 year ago
parent
commit
e6f15f0f13

+ 60 - 0
EQ2/source/WorldServer/Player.cpp

@@ -7137,3 +7137,63 @@ void Player::ClearGMVisualFilters() {
 	gm_visual_filters.clear();
 	vis_mutex.releasewritelock(__FUNCTION__, __LINE__);
 }
+
+int Player::GetPVPAlignment(){
+	int bind_zone = GetPlayerInfo()->GetBindZoneID();
+	int alignment = 0;
+
+	if(bind_zone && bind_zone != 0){
+	//0 is good.
+	//1 is evil.
+	//2 is neutral aka haven players.
+			switch(bind_zone){
+			//good zones
+				case 114: //Gfay
+				case 221: //Qeynos Harbor
+				case 222: //North Qeynos
+				case 231: //South Qeynos
+				case 233: //Nettleville
+				case 234: //Starcrest
+				case 235: //Graystone
+				case 236: //CastleView
+				case 237: //Willowood
+				case 238: //Baubbleshire
+				case 470: //Frostfang
+				case 589: //Qeynos Combined 1
+				case 660: //Qeynos Combined 2
+					alignment = 0; //good
+					break;
+				//evil zones				
+				case 128: //East Freeport
+				case 134: //Big Bend
+				case 135: //Stonestair
+				case 136: //Temple St.
+				case 137: //Beggars Ct.
+				case 138: //Longshadow
+				case 139: //Scale Yard
+				case 144: //North Freeport
+				case 166: //South Freeport
+				case 168: //West Freeport
+				case 184: //Neriak
+				case 644: //BigBend2
+				case 645: //Stonestair2
+				case 646: //Temple St2
+				case 647: //Beggars Ct2
+				case 648: //LongShadow2
+				case 649: //Scale Yard2
+					alignment = 1; //evil
+					break;
+				//Neutral (MajDul?)
+				case 45: //haven
+				case 46: //MajDul
+					alignment = 2;
+					break;
+				
+				default:
+					alignment = -1; //error
+			}
+		//return -1 (error), 0 (good), 1 (evil), or 2 (Neutral)
+		return alignment;
+	}
+	return -1; //error
+}

+ 1 - 0
EQ2/source/WorldServer/Player.h

@@ -1034,6 +1034,7 @@ public:
 	void AddGMVisualFilter(int32 filter_type, int32 filter_value, char* filter_search_str, int16 visual_tag);
 	int16 MatchGMVisualFilter(int32 filter_type, int32 filter_value, char* filter_search_str, bool in_vismutex_lock = false);
 	void ClearGMVisualFilters();
+	int GetPVPAlignment();
 	Mutex MPlayerQuests;
 	float   pos_packet_speed;
 private:

+ 11 - 0
EQ2/source/WorldServer/client.cpp

@@ -8952,6 +8952,17 @@ void Client::BeginWaypoint(const char* waypoint_name, float x, float y, float z)
 }
 
 void Client::InspectPlayer(Player* player_to_inspect) {
+	int source_pvp_alignment = GetPlayer()->GetPVPAlignment();
+	int target_pvp_alignment = player_to_inspect->GetPVPAlignment();
+	bool pvp_allowed = rule_manager.GetGlobalRule(R_PVP, AllowPVP)->GetBool();
+
+	if(pvp_allowed == true){
+		if(source_pvp_alignment != target_pvp_alignment){
+			Message(CHANNEL_COLOR_RED, "You can not inspect players of different alignments.");
+			return;
+		}
+	}
+	
 	if (player_to_inspect) {
 		PacketStruct* packet = configReader.getStruct("WS_InspectPlayer", GetVersion());
 		if (packet) {