Enemy Duplication Tutorial (WIP)

From Pikmin Technical Knowledge Base
Jump to navigation Jump to search

Basic summary of how to duplicate enemies using hard references in blueprint files, methods are not full proof and currently need more research to get working for all enemies.

Method Contributors[edit]

Requirements[edit]

Setting Up Your Blueprint File[edit]

  • Every enemy comes with a blueprint file corresponding to their enemy ID
  • Every blueprint file is located within Placeables/Teki/Enemy_ID

Step 1: Grab your enemy file of choice, for this example we will be using /Placeables/Teki/GDodoro.uasset.

Inside of the blueprint file you need to change various strings to get the enemy to work and be registered as it's own entity

  • 0x2155 = ENEMY_C ID
  • 0x16A5 = Default_C ID
  • 0x1813 = Teki Parameter ID
  • 0x180B = Actor Name ID
  • 0x638 = Soft Reference Path

Here I have documented the offsets you need to go to, for this example, we will be changing the string GDodoro to GDadoro

  • GDodoro_C = GDadoro_C
  • Default__GDodoro_C = Default__GDadoro_C
  • DODORO = DADORO
  • Dodoro = Dadoro
  • %/Game/Carrot4/Placeables/Teki/GDodoro = %/Game/Carrot4/Placeables/Teki/GDadoro

DT_TekiParameter Entry[edit]

After setting up your blueprint, navigate to the file labeled TekiParameter located in.

  • Core\GActor\DT_TekiParameter.uasset

Decompile this file using the *P4UassetEditor

Inside of the JSON, navigate to the bottom of the Teki Parameter file and create a new entry for your duplicated enemy.

[Example Screenshot]

Inside of this entry, we can see two particular references to the original blueprint we modified

those entries being the following.

  • 0x1813 = Teki Parameter ID
  • 0x180B = Actor Name ID

change the entries to match the modified blueprint's strings

Teki Parameter ID = DADORO Actor Name ID = GDadoro

after making a new entry, save and compile your new DT_TekiParameter file.

Manifest.json + Chunk ID's[edit]

For this example we will be using the original Manifest.json that comes with *UToc Packer

Open the Manifest.json in Visual Studio or any editing software

Inside of the manifest.json, we will be looking at GDodoro.uasset's entry

   {
     "Path": "/Carrot4/Content/Carrot4/Placeables/Teki/GDodoro.uasset",
     "ChunkId": "fa68a55fd087426200000002"
   },

Above, we have the entry in the manifest.json for GDodoro's blueprint file

  • "Path" = self explanatory, it is the file path of the compiled item
  • "ChunkId" = the id used to dedicate the existing data to the dependencies section

For this example, we will be sacrificing an unused file to give our new entity a slot.

I will be using this section below with the following chunk id

   {
     "Path": "/Carrot4/Content/Carrot4/Placeables/Teki/GDadoro.uasset",
     "ChunkId": "beba578ec3e0eb2800000002"
   },

Simply change your file path to your new file you want to register in the game, for this example I changed my file to Placeables/Teki/GDadoro.uasset

Now we need to find the dependencies of the file so that we can link them to the needed dependencies for GDodoro to prevent crashing.

Adding Dependencies[edit]

  • Dependencies = Files that work and register in tandem with a blueprint file or other related files to make an enemy work

To find the dependencies and attach them to our new enemy, we must first look at GDodoro's blueprint entry and it's chunk ID

The chunk ID for GDodoro is "fa68a55fd087426200000002"

  • Remove the 00000002 file type identifier and take the unique id "fa68a55fd0874262"
  • Convert "fa68a55fd0874262" into a decimal value
  • "fa68a55fd0874262" converted to decimal is "18043853737998893666"

Search for "18043853737998893666" in the manifest.json and view the example image below

[Dodoro Dependencies]

The main piece we want to extract from this data are the dependencies themselves.

  • These dependencies are all unique chunk id's that contain a related file to make Dodoro spawn, be it animations, property files, blueprints, materials, ECT

Copy the dependencies onto a notepad and copy the export objects value as well

       "exportObjects": 30,
       "dependencies": [
         17407843045982553768,
         17019850560319771916,
         8956011016958247193,
         3799598349955356934,
         102093049896583651,
         12001004102747703746,
         15693382491084914965,
         12374467043170984086,
         6020603924532580229,
         3336407754111646462,
         9602145455739581087,
         3978396927183273670,
         5261298423794478019,
         3499714614441730147,
         11699210257878842607,
         7210944756549394725,
         4085509499119183368,
         6854968642959447972,
         7585572468056942039,
         9158590446073112853,
         17861894223612263101,
         8308542404112000232,
         7786631499943187576

After having done that, navigate to your replaced chunk id file, for this example it will be

   {
     "Path": "/Carrot4/Content/Carrot4/Placeables/Teki/GDadoro.uasset",
     "ChunkId": "beba578ec3e0eb2800000002"
   },
  • Convert the chunk id into a decimal and repeat the process from before to find this item's dependencies

Inside the dependencies section, paste the dependencies from GDodoro into GDadoro and paste the export object value as well.

Save your manifest.json after making your edits and copying the dependencies onto your new enemy.

Hard References (GDodoroEgg)[edit]

A hard reference is a little endian formed chunk id reference seen in some blueprints for eggs and spawners

this hard reference calls directly from the manifest.json file registry

For this example we will be using the blueprint for GDodoroEgg

  • Retrieve the file located in \Placeables\Objects\Egg\GDodoroEgg.uasset
  • Decompile this file using P4UassetEditor and change the string Game/Carrot4/Placeables/Teki/GDodoro to Game/Carrot4/Placeables/Teki/GDadoro
  • After having compiled this file, open the file in a hex editor and navigate to the offset for the GDodoro Blueprint, I will include a hard reference list for GDodoroEgg below.

0x3964 Egg Break Anim 0x3A68 Egg Shake Anim

0x3978 DT_AudioData_DodoroEgg 0x398C DT_AudioFlag_DodoroEggAI

0x39A0 BP_CameraShake_Small 0x3A2C ABP_DodoroEgg

0x3A7C Hikari Station 0x3A90 GDodoro Blueprint 0x3A18 GTekiBase Blueprint 0x3A40 GBulletDodoroCurseBall Blueprint

0x39B4 DT_MaterialPA_DodoroEgg00 0x39F0 SK_stg_DodoroEgg_Shadow

0x39C8 PS_eft_Dodoro_Appear00 0x39DC DT_EftLoadDodoro 0x3A04 PS_eft_DodoroEgg_Hit00

  • at 0x3A90, you will see a little endian formatted ID, this is a hard reference, and thus is matching with the big endian chunk ID's seen in the manifest.json

Simply convert your new ID to little endian and paste it in the existing hex, for this example we used "beba578ec3e0eb28"

  • "beba578ec3e0eb28" converted to little endian is "28EBE0C38E57BABE".

Paste that in and save your DodoroEgg Blueprint.

Conclusion[edit]

After you have made all the appropriate modification, you will now have a unique Smokey Progg spawn from the Smokey Progg Egg Object and you will still be able to spawn the OG Smokey Progg without the egg

Having a new enemy duplicated, you can now change the model to make a unique model using the same methods, you can change ANY property in the blueprint for GDadoro.uasset and it will be registered with its own unique stats, models, ect

Thanks for reading and if you got this far in without exploding, props to you, though our research is far from over (read below)

Basic Problems + Dilemma + Soft References[edit]

Currently, the major problem with enemy duplication is getting enemies to spawn using soft references

  • Examples of soft references are strings used in tandem with existing blueprints to spawn enemies
  • EX: "/Game/Carrot4/Placeables/Teki/GChappy.GChappy_C"
  • EX: "/Game/Carrot4/Placeables/Teki/GFireTank.GFireTank_C"
  • EX: "/Game/Carrot4/Placeables/Teki/GYukiFutakuchi.GYukiFutakuchi_C"

Using these strings which are referenced in the blueprint files of duplicate enemies will not automatically help new enemies to spawn in via the soft reference method (generator files, zukan bp, ECT), It is currently unknown how to get additional soft references to work, feel free to add onto this article should you put time into researching the issue.

Having soft references would allow us to spawn the enemies wherever we want, without having to sacrifice eggs and other spawner objects and completely skip having to use hard references at all.

  • -- Sincerely, Lilith H