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 03-15-2021, 02:59 PM
ahamilton634's Avatar
ahamilton634
Sarnak
 
Join Date: Jul 2015
Location: Sunny California
Posts: 30
Default Zone specific object viewer?

I've been customizing zones by placing objects in the doors table, which I've read isn't the best system but I don't mind it. The problem I'm encountering is I've been using EQZoneViewer to get a list of object names. It seems to work okay, but it is also only compatible with .s3d files and not .eqg files. So when I'm populating newer zones I have to use older assets and I have to edit the globalload.txt file to get them to load.
I was wondering if there was a simpler way to get a list of placible objects. Perhaps one that would allow me to preview each object in both an .s3d and .eqg file. Does such a thing exist?
Reply With Quote
  #2  
Old 03-15-2021, 05:58 PM
Splose
Banned
 
Join Date: Apr 2014
Posts: 279
Default

How are you placing them.. Manually in the DB? Or are you using Akka's door plugin?

I'm not sure if this is the EQZoneViewer you were referring to but this can be useful as well at times.

You can also place weapons as doors and can view those here.

If you don't have that plugin here's an updated version. It makes the whole process much less tedious and it also comes with a DB table that lists a bunch of "doors" that are globally loaded. Don't worry about it not being the best system it's definitely amazing for customizing zones, especially if the model you want to use is already in the globalload since it doesn't require a file change for players.

The DB table is on the wiki under the plugins section I believe. If you have trouble getting it I can send you the dump for it.

quests/global/global_player.pl
Code:
sub EVENT_SAY {
	if($text=~/#door/i) {
		if($status >= 100) {
			plugin::HandleDoorCommands();
		} else {
			$client->Message(13, "Your access level is not high enough to use this command.");
		}
	} 
}

sub EVENT_CLICKDOOR {
    if($status >= 100) {
       plugin::HandleDoorClick();
    }
}
plugins/Doors_Manip.pl
Code:
sub HandleDoorCommands{
	#::: Declare scope variables to be used... :::#
	my $text = plugin::val('$text');
	my $door = plugin::val('$door');
	my $client = plugin::val('$client');
	my $entity_list = plugin::val('$entity_list');
	my $zonesn = plugin::val('$zonesn');
	
	if($client->GetEntityVariable("EditDoorClick") > 0){ $Door = $entity_list->GetDoorsByDoorID($client->GetEntityVariable("EditDoorClick")); }
	elsif($client->GetEntityVariable("CreateEditDoor") > 0){ $Door = $entity_list->GetDoorsByID($client->GetEntityVariable("CreateEditDoor")); }
	
	@arg = split(' ', $text); 
	if($arg[0]=~/#door/i){
		if(!$arg[1]){
			$client->Message(15, "#door - OPTIONS");
			$client->Message(15, "#door setincline <incline> - sets selected door incline");
			$client->Message(15, "#door opentype <opentype> - sets selected door opentype");
			$client->Message(15, "#door model <modelname> - Changes door model for selected door");
			$client->Message(15, "#door save - Creates database entry for highlighted door");
			$client->Message(15, quest::saylink("#door list", 1) . " - lists doors in zone");
			$client->Message(15, quest::saylink("#door edit", 1) . " - Brings up editing interface for selected door");
		}
		if($arg[1] =~/save/i){
			$Door->CreateDatabaseEntry();
			$client->Message(15, "Door saved");
		}
		if($arg[1] =~/movetome/i){
			$Door->SetLocation($client->GetX(), $client->GetY(), $client->GetZ());
		}
		if($arg[1] =~/create/i){
			if($arg[2]){
				if($arg[3]){ $size = $arg[3]; } else { $size = 100; }
				$ID = quest::createdoor(uc($arg[2]), $client->GetX(), $client->GetY(), $client->GetZ(), $client->GetHeading(), 58, $size); 
				$client->SetEntityVariable("CreateEditDoor", $ID);
				$client->Message(15, "Created Door ID: " . $ID);
			} else { $client->Message(15, "Usage: #door create modelname [size=100]"); }
		}
		if($arg[1] =~/changemodelqueue/i){
			$client->Message(15, "Type name of new model, current model is " . $Door->GetModelName());
			$client->Message(15, "#door model <modelname> or select from " . quest::saylink("#door showmodelszone", 1, "Local Zone") . " " . quest::saylink("#door showmodelsglobal", 1, "Global"));
		}
		if($arg[1] =~/size/i){
			$Door->SetSize($arg[2]);
		}
		if($arg[1] =~/showmodelsglobal/i){
			$connect = plugin::LoadMysql();
			$ModelsToSelectFrom = "";
			$client->Message(15, "Loading files...");
			$query_handle = $connect->prepare("SELECT file_from FROM `cust_obj_data` WHERE `object_name` LIKE '%IT%' AND zoneid = 0 AND object_name NOT LIKE '%OBJ%' GROUP by file_from;"); $query_handle->execute();
			while(@row = $query_handle->fetchrow_array()){
				if(length($ModelsToSelectFrom) > 4000){
					$client->Message(15, $ModelsToSelectFrom); 
					$ModelsToSelectFrom = quest::saylink("#door showmodelsfromfile " . $row[0], 1, $row[0]) . "-";
				}else{
					$ModelsToSelectFrom .= quest::saylink("#door showmodelsfromfile " . $row[0], 1, $row[0]) . "-";
				}
			}
			$client->Message(15, $ModelsToSelectFrom);
		}
		if($arg[1] =~/showmodelsfromfile/i){
			$connect = plugin::LoadMysql();
			$ModelsToSelectFrom = "";
			$client->Message(15, "Loading models from " . $arg[2]);
			$query_handle = $connect->prepare("SELECT `object_name` FROM `cust_obj_data` WHERE `file_from` = '". $arg[2] . "';"); $query_handle->execute();
			while(@row = $query_handle->fetchrow_array()){
				if(length($ModelsToSelectFrom) > 4000){
					$client->Message(15, $ModelsToSelectFrom); $ModelsToSelectFrom = quest::saylink("#door model " . $row[0], 1, $row[0]) . "-";
				}else{
					$ModelsToSelectFrom .= quest::saylink("#door model " . $row[0], 1, $row[0]) . "-";
				}
			}
			$client->Message(15, $ModelsToSelectFrom);
		}
		if($arg[1] =~/showmodelszone/i){
			$connect = plugin::LoadMysql();
			$ModelsToSelectFrom = "";
			$client->Message(15, "Loading models from $zonesn");
			$query_handle = $connect->prepare("SELECT `object_name` FROM `cust_obj_data` WHERE `zonesn` = '". $zonesn . "';"); $query_handle->execute();
			while(@row = $query_handle->fetchrow_array()){
				if(length($ModelsToSelectFrom) > 4000){
					$client->Message(15, $ModelsToSelectFrom); 
					$ModelsToSelectFrom = quest::saylink("#door model " . $row[0], 1, $row[0]) . "-";
				}else{
					$ModelsToSelectFrom .= quest::saylink("#door model " . $row[0], 1, $row[0]) . "-";
				}
			}
			$client->Message(15, $ModelsToSelectFrom);
		}
		if($arg[1] =~/list/i){ @doors = $entity_list->GetDoorsList(); 
			foreach $door (@doors){ 
				$client->Message(15, "ID: " . $door->GetDoorID() . " " . quest::saylink("#gmgoto " . int($door->GetX()) . " " . int($door->GetY()) . " " . int($door->GetZ())	, 1, $door->GetModelName()) . " X: " . $door->GetX() . " Y: " . $door->GetY() . " Z: " . $door->GetZ() . " Size: " . $door->GetSize() . " Open Type: " . $door->GetOpenType()); 
			} 
		}
		if($arg[1] =~/model/i){ if($arg[2]){ $Door->SetModelName(uc($arg[2])); } }
		if($arg[1] =~/opentype/i){ if($arg[2]){ $Door->SetOpenType($arg[2]); } }
		if($arg[1] eq "setincline"){
			if($arg[2]){  $Door->SetIncline($arg[2]);  }
			return;
		}
		if($arg[1] eq "setinclineinc"){
			if($arg[2]){  $Door->SetIncline($Door->GetIncline() + $arg[2]);  }
			#::: Incline Options #::: 
			if(!$arg[2]){
				$InclineOptions = "";
				%IncOptions = (
					1 => [.01, "Upright"],
					2 => [130, "+ 90 Degrees"],
					3 => [255, "+ 180 Degrees"],
					4 => [385, "+ 270 Degrees"],
					5 => [512.5, "+ 360 Degrees"],
				);
				$n = 1;
				while($IncOptions{$n}[0]){ $InclineOptions .= quest::saylink("#door setincline " . $IncOptions{$n}[0], 1, $IncOptions{$n}[1]) . " | ";  $n++; }
				$InclineOptionsP = ""; $InclineOptionsM = "";
				for($i = 0; $i <= 100; $i+=10){ if($i == 0){ $Num = 1; }else{ $Num = $i } $InclineOptionsP .= quest::saylink("#door setinclineinc " . $Num, 1, " ". abs($Num)); }
				for($i = -100; $i <= 0; $i+=10){ if($i == 0){ $Num = -1; }else{ $Num = $i } $InclineOptionsM .= quest::saylink("#door setinclineinc " . $Num, 1, " ". abs($Num)); }
				$client->Message(15, "Incline: [" . $InclineOptions . "]");
				$client->Message(15, "Incline Increments: [" . $InclineOptionsM  . " - | + " . $InclineOptionsP . "]");
			}
		}
		if($arg[1] =~/invertstate/i){
			$connect = plugin::LoadMysql();
			$query = "UPDATE `doors` SET `invert_state` = " . $arg[2] . " WHERE `id` = " . $Door->GetDoorDBID();
			$query_handle = $connect->prepare($query); $query_handle->execute();
			$client->Message(15, $query);
			$client->Message(15, "Reload Doors? " . quest::saylink("#reloadstatic", 0, "#reloadstatic"));
		}
		if($arg[1] =~/edit/i){
			if($client->GetEntityVariable("EditDoorClick") > 0){ $Door = $entity_list->GetDoorsByDoorID($client->GetEntityVariable("EditDoorClick")); }
			elsif($client->GetEntityVariable("CreateEditDoor") > 0){ $Door = $entity_list->GetDoorsByID($client->GetEntityVariable("CreateEditDoor")); }
			else { $client->Message(15, "You don't have a door selected to edit!"); return; }
			if($Door->GetDoorID() > 0 && $Door->GetDoorID() < 255){ $InvertState = " Invertstate [" . quest::saylink("#door invertstate 0", 1, "0") . " - " . quest::saylink("#door invertstate 1", 1, "1") . "]"; } else{ $InvertState = ""; }
			if(!$arg[2] && !$arg[3]){ $client->Message(15 ,"Door Selected: ID:" . $Door->GetDoorID() . " NAME: " . $Door->GetModelName() . " Opentype: " . $Door->GetOpenType() . $InvertState); }
			@MoveOptions = ("MoveX", "MoveY", "MoveZ", "MoveH", "SetSize");
			if($arg[1] && !$arg[2]){
				$OptionsXP = ""; $OptionsXM = ""; $OptionsYP = ""; $OptionsYM = ""; $OptionsZP = ""; $OptionsZM = ""; $OptionsHP = ""; $OptionsHM = ""; $OptionsSP = ""; $OptionsSM = "";
				foreach $val (@MoveOptions){
					if($val eq "MoveX"){
						$OptionsXP .= quest::saylink("#door edit MoveX .25", 1, " .25");
						for($i = 0; $i <= 15; $i+=5){ if($i == 0){ $Num = 1; }else{ $Num = $i } $OptionsXP .= quest::saylink("#door edit MoveX " . $Num, 1, " ". abs($Num)); }
						for($i = -15; $i <= 0; $i+=5){ if($i == 0){ $Num = -1; }else{ $Num = $i } $OptionsXM .= quest::saylink("#door edit MoveX " . $Num, 1, " ". abs($Num)); }
						$OptionsXM .= quest::saylink("#door edit MoveX -.25", 1, " .25");
					}
					if($val eq "MoveY"){
						$OptionsYP .= quest::saylink("#door edit MoveY .25", 1, " .25");
						for($i = 0; $i <= 15; $i+=5){ if($i == 0){ $Num = 1; }else{ $Num = $i } $OptionsYP .= quest::saylink("#door edit MoveY " . $Num, 1, " ". abs($Num)); }
						for($i = -15; $i <= 0; $i+=5){ if($i == 0){ $Num = -1; }else{ $Num = $i } $OptionsYM .= quest::saylink("#door edit MoveY " . $Num, 1, " ". abs($Num)); }
						$OptionsYM .= quest::saylink("#door edit MoveY -.25", 1, " .25");
					}
					if($val eq "MoveZ"){
						$OptionsZP .= quest::saylink("#door edit MoveZ .25", 1, " .25");
						for($i = 0; $i <= 15; $i+=5){ if($i == 0){ $Num = 1; }else{ $Num = $i } $OptionsZP .= quest::saylink("#door edit MoveZ " . $Num, 1, " ". abs($Num)); }
						for($i = -15; $i <= 0; $i+=5){ if($i == 0){ $Num = -1; }else{ $Num = $i } $OptionsZM .= quest::saylink("#door edit MoveZ " . $Num, 1, " ". abs($Num)); }
						$OptionsZM .= quest::saylink("#door edit MoveZ -.25", 1, " .25");
					}
					if($val eq "MoveH"){
						for($i = 0; $i <= 50; $i+=5){ if($i == 0){ $Num = 1; }else{ $Num = $i } $OptionsHP .= quest::saylink("#door edit MoveH " . $Num, 1, " ". abs($Num)); }
						for($i = -50; $i <= 0; $i+=5){  if($i == 0){ $Num = -1; }else{ $Num = $i } $OptionsHM .= quest::saylink("#door edit MoveH " . $Num, 1, " ". abs($Num)); }
					}
					if($val eq "SetSize"){
						for($i = 0; $i <= 100; $i+=10){ if($i == 0){ $Num = 1; }else{ $Num = $i } $OptionsSP .= quest::saylink("#door edit SetSize " . $Num, 1, " ". abs($Num)); }
						for($i = 0; $i >= -100; $i-=10){ if($i == 0){ $Num = -1; }else{ $Num = $i } $OptionsSM .= quest::saylink("#door edit SetSize " . $Num, 1, " ". abs($Num)); }
					}
				}
				$client->Message(15, "NAME: [" . $Door->GetModelName() . "] [" . quest::saylink("#door save", 1, "SAVE") . "] [" . quest::saylink("#door changemodelqueue", 1, "Change Model") . "]" . " [" . quest::saylink("#door setinclineinc", 1, "Incline") . "]");
				$client->Message(15, "[". $OptionsXM . " - [X] +" . $OptionsXP . "]");
				$client->Message(15, "[". $OptionsYM . " - [Y] + " . $OptionsYP . "]");
				$client->Message(15, "[". $OptionsZM . " - [Z] + " . $OptionsZP . "]");
				$client->Message(15, "[". $OptionsHM . " - [H] + " . $OptionsHP . "]");
				$client->Message(15, "[". $OptionsSM . " - [SIZE] + " . $OptionsSP . "]");
			}
			if($arg[3]){
				$XM = 0; $YM = 0; $ZM = 0; $HM = 0; $Size = 0;
				if($arg[2] eq "MoveX"){ $XM = $arg[3]; }
				if($arg[2] eq "MoveY"){ $YM = $arg[3]; }
				if($arg[2] eq "MoveZ"){ $ZM = $arg[3]; }
				if($arg[2] eq "MoveH"){ $HM = $arg[3]; }
				if($arg[2] eq "SetSize"){ $Size = $arg[3]; }
				#quest::say("DEBUG $XM - $YM - $ZM - $HM");
				$Door->SetLocation($Door->GetX() + $XM, $Door->GetY() + $YM, $Door->GetZ()+ $ZM);
				$Door->SetHeading($Door->GetHeading() + $HM);
				$Door->SetSize($Door->GetSize() + $Size);
			}
			#::: Coordinate Helpers
			# REPLACE INTO `npc_types` (`id`, `name`, `lastname`, `level`, `race`, `class`, `bodytype`, `hp`, `mana`, `gender`, `texture`, `helmtexture`, `size`, `hp_regen_rate`, `mana_regen_rate`, `loottable_id`, `merchant_id`, `alt_currency_id`, `npc_spells_id`, `npc_faction_id`, `adventure_template_id`, `trap_template`, `mindmg`, `maxdmg`, `attack_count`, `npcspecialattks`, `aggroradius`, `face`, `luclin_hairstyle`, `luclin_haircolor`, `luclin_eyecolor`, `luclin_eyecolor2`, `luclin_beardcolor`, `luclin_beard`, `drakkin_heritage`, `drakkin_tattoo`, `drakkin_details`, `armortint_id`, `armortint_red`, `armortint_green`, `armortint_blue`, `d_meele_texture1`, `d_meele_texture2`, `prim_melee_type`, `sec_melee_type`, `runspeed`, `MR`, `CR`, `DR`, `FR`, `PR`, `Corrup`, `see_invis`, `see_invis_undead`, `qglobal`, `AC`, `npc_aggro`, `spawn_limit`, `attack_speed`, `findable`, `STR`, `STA`, `DEX`, `AGI`, `_INT`, `WIS`, `CHA`, `see_hide`, `see_improved_hide`, `trackable`, `isbot`, `exclude`, `ATK`, `Accuracy`, `slow_mitigation`, `version`, `maxlevel`, `scalerate`, `private_corpse`, `unique_spawn_by_name`, `underwater`, `isquest`, `emoteid`) VALUES (51, '-X', NULL, 1, 127, 1, 11, 31, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 'ZiGH', 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 1.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 75, 80, 75, 75, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0);
			# REPLACE INTO `npc_types` (`id`, `name`, `lastname`, `level`, `race`, `class`, `bodytype`, `hp`, `mana`, `gender`, `texture`, `helmtexture`, `size`, `hp_regen_rate`, `mana_regen_rate`, `loottable_id`, `merchant_id`, `alt_currency_id`, `npc_spells_id`, `npc_faction_id`, `adventure_template_id`, `trap_template`, `mindmg`, `maxdmg`, `attack_count`, `npcspecialattks`, `aggroradius`, `face`, `luclin_hairstyle`, `luclin_haircolor`, `luclin_eyecolor`, `luclin_eyecolor2`, `luclin_beardcolor`, `luclin_beard`, `drakkin_heritage`, `drakkin_tattoo`, `drakkin_details`, `armortint_id`, `armortint_red`, `armortint_green`, `armortint_blue`, `d_meele_texture1`, `d_meele_texture2`, `prim_melee_type`, `sec_melee_type`, `runspeed`, `MR`, `CR`, `DR`, `FR`, `PR`, `Corrup`, `see_invis`, `see_invis_undead`, `qglobal`, `AC`, `npc_aggro`, `spawn_limit`, `attack_speed`, `findable`, `STR`, `STA`, `DEX`, `AGI`, `_INT`, `WIS`, `CHA`, `see_hide`, `see_improved_hide`, `trackable`, `isbot`, `exclude`, `ATK`, `Accuracy`, `slow_mitigation`, `version`, `maxlevel`, `scalerate`, `private_corpse`, `unique_spawn_by_name`, `underwater`, `isquest`, `emoteid`) VALUES (52, '+X', NULL, 1, 127, 1, 11, 31, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 'ZiGH', 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 1.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 75, 80, 75, 75, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0);
			# REPLACE INTO `npc_types` (`id`, `name`, `lastname`, `level`, `race`, `class`, `bodytype`, `hp`, `mana`, `gender`, `texture`, `helmtexture`, `size`, `hp_regen_rate`, `mana_regen_rate`, `loottable_id`, `merchant_id`, `alt_currency_id`, `npc_spells_id`, `npc_faction_id`, `adventure_template_id`, `trap_template`, `mindmg`, `maxdmg`, `attack_count`, `npcspecialattks`, `aggroradius`, `face`, `luclin_hairstyle`, `luclin_haircolor`, `luclin_eyecolor`, `luclin_eyecolor2`, `luclin_beardcolor`, `luclin_beard`, `drakkin_heritage`, `drakkin_tattoo`, `drakkin_details`, `armortint_id`, `armortint_red`, `armortint_green`, `armortint_blue`, `d_meele_texture1`, `d_meele_texture2`, `prim_melee_type`, `sec_melee_type`, `runspeed`, `MR`, `CR`, `DR`, `FR`, `PR`, `Corrup`, `see_invis`, `see_invis_undead`, `qglobal`, `AC`, `npc_aggro`, `spawn_limit`, `attack_speed`, `findable`, `STR`, `STA`, `DEX`, `AGI`, `_INT`, `WIS`, `CHA`, `see_hide`, `see_improved_hide`, `trackable`, `isbot`, `exclude`, `ATK`, `Accuracy`, `slow_mitigation`, `version`, `maxlevel`, `scalerate`, `private_corpse`, `unique_spawn_by_name`, `underwater`, `isquest`, `emoteid`) VALUES (53, '-Y', NULL, 1, 127, 1, 11, 31, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 'ZiGH', 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 1.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 75, 80, 75, 75, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0);
			# REPLACE INTO `npc_types` (`id`, `name`, `lastname`, `level`, `race`, `class`, `bodytype`, `hp`, `mana`, `gender`, `texture`, `helmtexture`, `size`, `hp_regen_rate`, `mana_regen_rate`, `loottable_id`, `merchant_id`, `alt_currency_id`, `npc_spells_id`, `npc_faction_id`, `adventure_template_id`, `trap_template`, `mindmg`, `maxdmg`, `attack_count`, `npcspecialattks`, `aggroradius`, `face`, `luclin_hairstyle`, `luclin_haircolor`, `luclin_eyecolor`, `luclin_eyecolor2`, `luclin_beardcolor`, `luclin_beard`, `drakkin_heritage`, `drakkin_tattoo`, `drakkin_details`, `armortint_id`, `armortint_red`, `armortint_green`, `armortint_blue`, `d_meele_texture1`, `d_meele_texture2`, `prim_melee_type`, `sec_melee_type`, `runspeed`, `MR`, `CR`, `DR`, `FR`, `PR`, `Corrup`, `see_invis`, `see_invis_undead`, `qglobal`, `AC`, `npc_aggro`, `spawn_limit`, `attack_speed`, `findable`, `STR`, `STA`, `DEX`, `AGI`, `_INT`, `WIS`, `CHA`, `see_hide`, `see_improved_hide`, `trackable`, `isbot`, `exclude`, `ATK`, `Accuracy`, `slow_mitigation`, `version`, `maxlevel`, `scalerate`, `private_corpse`, `unique_spawn_by_name`, `underwater`, `isquest`, `emoteid`) VALUES (54, '+Y', NULL, 1, 127, 1, 11, 31, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 'ZiGH', 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 1.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 75, 80, 75, 75, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0);
			if(!$entity_list->GetNPCByNPCTypeID(51)){  quest::spawn2(51, 0, 0, ($Door->GetX() + $XM - 15), $Door->GetY() + $YM, $Door->GetZ()+ $ZM, 0); }else{ my $ent = $entity_list->GetNPCByNPCTypeID(51); $ent->GMMove(($Door->GetX() + $XM - 15), $Door->GetY() + $YM, $Door->GetZ() + $ZM + 5, 0); }
			if(!$entity_list->GetNPCByNPCTypeID(52)){  quest::spawn2(52, 0, 0, ($Door->GetX() + $XM + 15), $Door->GetY() + $YM, $Door->GetZ()+ $ZM, 0);  }else{ my $ent = $entity_list->GetNPCByNPCTypeID(52); $ent->GMMove(($Door->GetX() + $XM + 15), $Door->GetY() + $YM, $Door->GetZ() + $ZM + 5, 0); }
			if(!$entity_list->GetNPCByNPCTypeID(53)){  quest::spawn2(53, 0, 0, $Door->GetX() + $XM, ($Door->GetY() + $YM - 15), $Door->GetZ()+ $ZM, 0);  }else{ my $ent = $entity_list->GetNPCByNPCTypeID(53); $ent->GMMove($Door->GetX() + $XM, ($Door->GetY() + $YM - 15), $Door->GetZ() + $ZM + 5, 0); }
			if(!$entity_list->GetNPCByNPCTypeID(54)){  quest::spawn2(54, 0, 0, $Door->GetX() + $XM,  ($Door->GetY() + $YM + 15), $Door->GetZ()+ $ZM, 0);  }else{ my $ent = $entity_list->GetNPCByNPCTypeID(54); $ent->GMMove($Door->GetX() + $XM, ($Door->GetY() + $YM + 15), $Door->GetZ() + $ZM + 5, 0); }
		}
	}
}

sub HandleDoorClick {
	my $doorid = plugin::val('$doorid');
	my $client = plugin::val('$client');
	$client->Message(15, "Door $doorid [" . quest::saylink("Close Door $doorid", 1, "Close Door") . "][" . quest::saylink("Open Door $doorid", 1, "Open Door") . "] [" . quest::saylink("#door edit", 1, "Edit Door") . "]");
	$client->SetEntityVariable("EditDoorClick", $doorid);
}
Here's an example of the Door plugin in use:

Reply With Quote
  #3  
Old 03-15-2021, 08:29 PM
ChaosSlayerZ's Avatar
ChaosSlayerZ
Demi-God
 
Join Date: Mar 2009
Location: Umm
Posts: 1,492
Default

Splose, this is awesome info.
I keep forgetting about that door tool. Thank you!
I need to try it out - I nee so many doors added
How exactly do you access the global doors list?
Reply With Quote
  #4  
Old 03-15-2021, 11:28 PM
Splose
Banned
 
Join Date: Apr 2014
Posts: 279
Default

Quote:
Originally Posted by ChaosSlayerZ View Post
Splose, this is awesome info.
I keep forgetting about that door tool. Thank you!
I need to try it out - I nee so many doors added
How exactly do you access the global doors list?
From the 'cust_obj_data' DB table located here.

If you are trying to look at the global list I'd recommend unloading mq2 first. It will crash you because too many things being sent to chat box.

Honestly I haven't used the DB table in forever.. and I don't even have it on the new DB I've been working on. Generally I go and find a model that I want and open up the zone in that GLModelViewer I linked above to find what I need.
Reply With Quote
  #5  
Old 03-20-2021, 10:32 PM
ahamilton634's Avatar
ahamilton634
Sarnak
 
Join Date: Jul 2015
Location: Sunny California
Posts: 30
Default

Thanks everyone for the awesome answers!
I loaded up the cust_obj_data table, but it doesn't appear to have Dragonscale Hills which is the zone I'm working on. Is there an option that would allow me to preview the object?
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 05:55 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 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3