New Pre-CU Planet: Hoth

Aug 17, 2014
229
1
18
I have scoured the code...  though I have a good concept of what needs to be done, I am still not technically capable of making the change that will allow Echo Base and the Morag Cave to be fully functional.  Server admins can change their close object range at their own risk, I'm not going to start sending out code that might mess people up.

Because of this limitation, and the fact that I know everyone will want to do what they please with Hoth regardless of how I populate it...

I'll be releasing the terrain as a standalone this week for sure.  I am making the package today, and will be asking Sytner for a map render. I will include a basic snapshot as well, and basic datables, string entries, etc... possibly make an asset and spawn pack to follow up eventually.

Though on my private environment, I am close to achieving my personal vision, it is made possible by a few band-aids that I just can't push out in a release.

I will keep building the planet on Choice Test, and as the code stabilizes and possibly includes new features, I will keep Hoth up to date and include it in my eventual "big stack o' planets and content" mod ..

just a note... (though a fully restored Kashyyyk is on the long term list for myself and others)... I really like Myyydril/Morag on Hoth. I made a special ice cave entrance and everything, but it just has similar issues as EB... still going to populate it on Choice Test, tried to come up with a plausible story line for some quests and content there.
 
Aug 17, 2014
229
1
18
Heard from Sytner, so unless the map reveals something horrible and ugly, on track for a quick-release.

Also... I figured out a few things with Kashyyyk... so I might have this terrain file ready soon as well - the snapshot is another story, but I'm working on translating from buildout. Thanks to langelusse for motivating me

http://i.imgur.com/pnJZmzbh.jpg
 
Aug 17, 2014
229
1
18
Nee said:
Is  the dream still alive...?
Most definitely.

I mean, It's been released...  as a standalone terrain AND a full version for MTGClient

and it's live on Sunrunner II 24/7...

BUT

Echo Base is still held back by the hangar bay bugs.  I've made everyone well aware of the bugs, they are available to be experienced and tested first hand on my server and in my releases.

This is partially why I started my own server, to have a place to keep the projects live and open for testing.  I certainly plan to have my final version available when I launch for play in July/August.

Hoth in particular has required me to step aside into areas of modding that were completely new to me... and I'm doing it all myself, not just taking others' work... so for instance, I *just* got mountable tauntauns, flyable snowspeeders, wearable snow armor integrated in the past month.

There are also other general developments on my server that may render some of the Echo Base problems moot. I'm looking at a couple of unique ways to work around it...

-- also... There will still be terrain updates, I just have to get over some technical humps in order to return to world building as my primary...
 

Valkyra

Moderator
Staff member
Moderator
Aug 31, 2010
196
12
18
I'm not on my main PC right now so I can't really reference code I've written, that being said though, I've recently done a lot of buildout spawning manager code rework for CUEmu.

Basically, I have it reading from the TOCs in Core3, BuildoutManager is it's own instanced managed service. First, it reads the datatable file for the buildout scenes in the CU client, which opens the areas_(planetname).iff file in the same directory, based off that name in the first datatable. Then, it iterates and opens each buildout area within THAT Datatable, which the final datatable iff has the buildout objects that are spawned within the buildout area, with offsets in the world coodinates from the Buildout Area. Basically, it establishes a x1/z1/x2/z2 world point area on a planet, and the objects are not global (solely using the buildout object coords), but also factoring in the coords of the area.

I also have the formula SOE used for version 1 of the Buildout IFF's calculating object ID's, because they are not in version 1. Example, in our CU Client, attempting to radial a selected object (for example), on per say Mustafar, will always give the same object ID argument. The caveat is, all of these objectID's are signed int64 data type. Unfortunately Core3 doesn't have the capability to store negative OID objects within BDB datatables, so I had to modify each object-parsing packet file in Core3 to more or less invert the negative to make it unsigned. Though none of this really applies to a Pre-CU Hoth, since you're using world snapshots in a Pre-CU client.

More to the issue present, object range. Since I'm spawning all buildout objects in a new manager, I have put in code that sets the visible range value in the QuadTree based off what is in the CU datatable file, the column name is 'radius', a Float. For some reason Mensix Facility on Mustafar is kind of short range, but they probably did that because even on my powerful PC rig, it still takes awhile for the entire building to fully load.

To modify this, you just have to have a Zone pointer in the cpp function, and call "inRange", which will set a specified scene object pointer's range, which is the 2nd parameter.

So, for my Buildout Manager, I do something like: "zone->inRange(object, radius);", zone being the planet's pointer, object being the SceneObject (in this case, a building), and radius is the float pulled from the datatable. I even made new members in SceneObject for storing, setting, and getting the object's range value, but that's up to you.

Now, what you COULD do, is see how the Dathomir FS Village area is spawned in the code, I believe the file name has '768m' within, since that's it's radius meter length. Anyway, you could add similar code to that file (I'm not sure which one it's in off the top of my head), an if statement to see if the zone being loaded is Hoth. If so, spawn Echo Base similar to how the village area is spawned, then use that object pointer to set the Hoth zone's inRange value, to something I assume would be larger than the default value declared already, for Echo Base's hangar. Maybe even attach scenery alike to the FS village area, though I'm not 100% sure the purpose of that due to not extensively looking into it.

So, recap - take out Echo Base from WS and LUA, code it into CPP, along with any other problematic building, and it's children objects. I'm not fully sure on the Core3 server load order, though - example if that Zone portion of the code is loaded AFTER WS and/or LUA screenplays, and you've put child objects of the building (npcs, scene objects, etc), it won't have the parent building to reference. Though, if the Zone code is indeed loaded first, you can change your spawning within the LUA screenplay script to just get the building pointer in Lua, instead of just spawning it within Lua scripts. You may have to add some code in CPP of DirectorManager, to be able to get a SceneObject on a certain zone, at certain coordinates. I actually did this in our CU code, so that I could grab the pointer of the Myyydril caverns building on Kashyyyk, for the purposes of implementing the NK Necrosis quest instance. My code is different because there's 9 (I think) myyydril cavern buildings on the terrain, due to how SOE faux 'instances' worked, in my screenplay I have a for loop to iterate through multiples of coordinates, since that's how it's lined up in Datatables, at least for spawning the initial quest starting NPC for each building.

Kind of went a little more in-depth than what you'd need, but I'm hoping the knowledge is helpful.
 
Oct 10, 2017
205
9
18
Valkyra, you're rocking me... or smashing me with a rock. I don't know.
But my knowledge about Core3 isn't so huge.
I tried aswell to spawn Echo Base via LUA, taking it out from its snapshot but didn't work.
I'll try to understand what you mean. I appreciate your help.
Thanks, sir.
 
Oct 10, 2017
205
9
18
It's a strange bug. I thought it was related to CRCs but client and server get the same.
Yuo can get into the base but not attack, spawn anything, sitting... It's like when they don't have the same CRC, as i said...
 
Oct 10, 2017
205
9
18
Well i'm trying to fix via snapshot but , can anyone else confirm Echo base Hangar Bay has that bug?. The rest of Cell Ids are ok.
 
Aug 17, 2014
229
1
18
Valk... wish I'd seen this reply earlier. Fascinating idea! After these two years... Echo Base is still a pain in the ass... but Hoth itself has grown quite a bit, around it.
 
Oct 10, 2017
205
9
18
Echo Base is working fine when you teleport in there.
If you try /teleport -227 452 hoth 73.3 6452932 you won't feel the static bug.

But now, i could try to add a trigger to teleport there, using a npc or using the door.
Does anyone have the screenplay for Echo Base for their switches inside the base?.
Thank you guys.
 
Last edited:
Oct 10, 2017
205
9
18
So this is my fix for the bug of Echo Base:
* Note: This is just an example. The npcs are located at the secondary door, left side from the Hangar.


PART 1:

Add the correct template for the conversation 2 npcs you'll need later:
Code:
conversationTemplate = "echotrooper1_template",
and the template for the second npc:
Code:
conversationTemplate = "echotrooper2_template",
---------------------------
* Register the npcs into your serverobjects.lua. You'll need more than this part if you want to make a custom npc appearance.
---------------------------

Get into your Conversation folder and create new files and register them in conversations.lua. My language is spanish, so change if you noticed:
-- -- -- -- --

echotrooper1_conv.lua :

Code:
echotrooper1_template = ConvoTemplate:new {
    initialScreen = "start",
    templateType = "Lua",
    luaClassHandler = "echotrooperone_convo_handler",
    screens = {}
}
-------

echotrooper1_start = ConvoScreen:new {
    id = "start",
    customDialogText = "Por favor, no me mates!",
    stopConversation = "false",
    options = {
        { "Si no me dices que sucede aqui te lo hare.", "intro2" },
        { "No te preocupes, me voy.", "bye" },
    }
}
echotrooper1_template:addScreen(echotrooper1_start);
------


echotrooper1_intro2 = ConvoScreen:new {
    id = "intro2",
  customDialogText = "Disculpeme por favor. Solo estoy vigilando la entrada de esta base rebelde abandonada, junto con otro recluta que esta al otro lado de la puerta. No somos una amenaza.",
    stopConversation = "false",
    options = {
        { "Quien te dijo eso?", "intro3" },
        { "Lo siento, me marcho.", "bye" },
    }
}
echotrooper1_template:addScreen(echotrooper1_intro2);
------


echotrooper1_intro3 = ConvoScreen:new {
    id = "intro3",
  customDialogText = "Mi oficial superior. A el no le importa el frio que estoy pasando aqui fuera. Es escoria imperial.",
    stopConversation = "false",
    options = {
        { "Entiendo.", "intro4" },
        { "No me importa, adios", "bye" },
    }
}
echotrooper1_template:addScreen(echotrooper1_intro3);
-------------

echotrooper1_intro4 = ConvoScreen:new {
    id = "intro4",
customDialogText = "Ese tipo nos trata muy mal. De hecho ahora mismo me daria igual si alguien quisiera colarse por este cordon de seguridad...",
    stopConversation = "false",
    options = {
        { "Mmm... Eso quiere decir que puedo echar un vistazo?", "intro5" },
        { "Adios.", "bye" },
    }
}
echotrooper1_template:addScreen(echotrooper1_intro4);
----------------

echotrooper1_intro5 = ConvoScreen:new {
  id = "intro5",
  customDialogText = "Mientras no diga que le he dejado pasar o me mandaran a las minas de Kessel.",
  stopConversation = "false",
  options = {
        { "Tanquilo, no te delatare.", "intro6" },
        { "Lo siento, debo irme.", "bye" },
    }
}
echotrooper1_template:addScreen(echotrooper1_intro5);
----------------
echotrooper1_intro6 = ConvoScreen:new {
    id = "intro6",
    customDialogText = "De acuerdo, pase. Avisare al guardia del otro lado por si quiere volver a salir, pero debo advertirle que dentro puede ser peligroso.",
    stopConversation = "false",
        options = {
            { "No te preopues por mi.", "aceptado" },
            { "Mejor me marcho.", "bye" },
    }
}
echotrooper1_template:addScreen(echotrooper1_intro6);
----------

echotrooper1_aceptado = ConvoScreen:new {
    id = "aceptado",
    customDialogText = "",
    stopConversation = "true",
    options = {}
}
echotrooper1_template:addScreen(echotrooper1_aceptado);

---------


echotrooper1_bye = ConvoScreen:new {
  id = "bye",
  customDialogText = "Adios.",
  stopConversation = "true",
  options = {}
}
echotrooper1_template:addScreen(echotrooper1_bye);
---------------------
--------
echotrooper1_bye2 = ConvoScreen:new {
  id = "bye2",
  customDialogText = "Saludos.",
  stopConversation = "true",
  options = {}
}
echotrooper1_template:addScreen(echotrooper1_bye2);
--------------

echotrooper1_otravez = ConvoScreen:new {
    id = "otravez",
    customDialogText = "Hola de nuevo. Desea pasar otra vez a esta base?",
    stopConversation = "false",
  options = {
        { "Si, gracias.", "otravez2" },
        { "No, no... No tengo nada que hacer ahi.", "bye" },
    }
}
echotrooper1_template:addScreen(echotrooper1_otravez);

echotrooper1_otravez2 = ConvoScreen:new {
    id = "otravez2",
    customDialogText = "",
    stopConversation = "true",
    options = {}
}
echotrooper1_template:addScreen(echotrooper1_otravez2);
------
addConversationTemplate("echotrooper1_template", echotrooper1_template);
-----
-- -- -- -- --
 
Last edited:
Oct 10, 2017
205
9
18
PART 2:

echotrooper2_conv.lua :

Code:
echotrooper2_template = ConvoTemplate:new {
    initialScreen = "start",
    templateType = "Lua",
    luaClassHandler = "echotroopertwo_convo_handler",
    screens = {}
}
-------

echotrooper2_start = ConvoScreen:new {
    id = "start",
    customDialogText = "Desea salir de la Base?",
    stopConversation = "false",
    options = {
        {"Si, gracias.", "aceptado"},
        {"Todavia no.", "bye"},
    }
}
echotrooper2_template:addScreen(echotrooper2_start);
----------

echotrooper2_aceptado = ConvoScreen:new {
    id = "aceptado",
    customDialogText = "",
    stopConversation = "true",
    options = {}
}
echotrooper2_template:addScreen(echotrooper2_aceptado);
--------

echotrooper2_bye = ConvoScreen:new {
  id = "bye",
  customDialogText = "Adios.",
  stopConversation = "true",
  options = {}
}
echotrooper2_template:addScreen(echotrooper2_bye);
---------------------

addConversationTemplate("echotrooper2_template", echotrooper2_template);
-------------------------------
 
Oct 10, 2017
205
9
18
PART 3:

** Next parts are the scripts for the screenplays. Register your new screenplays into your screenplays.lua:

echotrooper1.lua [this first npc will get two conversations, first meet and revisit]
echotrooper2.lua .

----------------

* Now, one of the NPCS will take you inside the Echo Base and the other will give you access to exit with no bugs. You just need to block the Echo Base entrances.

PD: I saw a very poor interest for helping. I'm sure there are a lot of people able to help in this way (no Admins or MTG staff. They have already done enough giving us these great tools). I think some of our members don't like to share their work but they always expect some help when needing. That's not the manner. It's a pity we have arrived at this.

Anyways, thank you and i hope this helps people who need.
 

Attachments

Last edited:
Oct 10, 2017
205
9
18
Now, we only need to script some elevator terminals using under Echo Base Screenplay...
I tried, but it didn't work. Any idea?. Maybe i made a mistake using spawnSceneObject{....}
 

Cyberspike

New Member
Nov 27, 2013
5
1
3
Aeryna,

Try these files. One folder has the elevator screenplay and the menu component one I use. The other has the object files for the elevator terminals.
 

Attachments

Oct 10, 2017
205
9
18
Aeryna,

Try these files. One folder has the elevator screenplay and the menu component one I use. The other has the object files for the elevator terminals.
Your tip and help were nice.
Now by some reason (maybe by Echo Base object) i tried to add playeffect but it didn't work. My brain is broken now.

Code:
CreatureObject(pPlayer):playEffect("clienteffect", "elevator_ascend.cef")
 
Last edited:
Oct 10, 2017
205
9
18
Code:
CreatureObject(pPlayer):playEffect("clienteffect/elevator_rise.cef", "")
Vs

Code:
CreatureObject(pPlayer):playEffect("clienteffect", "elevator_ascend.cef")

I see.
 
Oct 10, 2017
205
9
18
And does anyone know where the elevators of these two caves were leading???. I don't remember from NGE. I think one of them leads to the Echo Base watchtower.

ID 6452956 and ID 6452958.


-------
screenShot0246.jpg screenShot0247.jpg