Tutorial Custom Species

Discussion in 'Starbound Modding' started by projectmayhem, Mar 24, 2017.

  1. projectmayhem

    projectmayhem Spaceman Spiff

    First off, I would like to thank Kyuko for this guide on custom species. It is what I followed, but I guess since patching it needs more to work. So here I figured I'd make a list of everything I did to get my custom species working. Also would like to thank DrPvtSkittles and his skelekin race mod, I dug through it to figure out what the original tutorial was missing.

    Here we go! I have a Star Wars mod I am working on, so I made a Wookie species. I'm going to go in order of the folders, so sorry if the guide seems weird.

    ***IMPORTANT***
    You need a character extender mod to see your species. I use http://community.playstarbound.com/resources/kawas-xbawks-mode-character-creator.81/


    Step 1
    Inside your mod folder, make a patch file for player.config. Code should look like this.

    [
    { "op" : "add", "path" : "/defaultCodexes/wookie", "value" : [ "protectorate1", "protectorate2", "wookiediary" ] },
    ]

    of course, replace wookie with whatever your species name is. Save the file as player.config.patch and place it in your mod folder.

    Step 2
    universe.config needs patched with code like this.

    [
    {
    "op" : "add", "path" : "/speciesShips/wookie", "value" : ["/ships/wookie/humanT0.structure", "/ships/wookie/humanT1.structure", "/ships/wookie/humanT2.structure", "/ships/wookie/humanT3.structure", "/ships/wookie/humanT4.structure", "/ships/wookie/humanT5.structure", "/ships/wookie/humanT6.structure", "/ships/wookie/humanT7.structure", "/ships/wookie/humanT8.structure"]
    },
    ]


    Once again, change wookie to your species name. And if you end up making custom ships, you'll need to change the ship structure names to match yours, but I used human ships since I haven't got into ship designing yet. universe.config.patch will also be placed in your mod folder.

    Step 3
    make a folder called ai and open it. In that folder you need an ai.config patch that looks like this

    [
    {
    "op" : "add",
    "path" : "/species/wookie",
    "value" : {
    "aiFrames" : "WookieAI.png",
    "portraitFrames" : "portraits/wookieportrait.png",
    "staticFrames" : "staticwookie.png"
    }
    },
    ]


    Replace wookie with your species name (From here one out, I'll just use YOURSPECIES or yourspecies, just insert your species name there). Also inside the ai folder you need the staticYOURSPECIES.png and staticYOURSPECIES.frame files. You can find these in the unpacked assets ai folder. just copy them over to your folder and rename them. Change any colors you want on the png file. Now you need the yourspeciesAI.png and yourspeciesAI.frame files. You can copy one of them over from the unpacked ai folder and edit it how you like. I tinted mine brown to make wookie fur. Make sure if you keep capitalization matching, my AI png is WookieAI.png, so if you use a lowercase like wookieAI.png, make sure your config patch above matches.

    Step 4

    Inside your ai folder make a new folder name portraits. Copy a set of files from the unpacked portraits folder. Rename them YOURSPECIESquestportrait.png and YOURSPECIESportrait.png and edit them however you need to. I tinted mine brown again.

    Step 5

    In your mod folder, make a cinematics folder. In that folder, make a repsawn, teleport and story folder.

    Step 6

    Open the respawn folder and make a new folder named YOURSPECIES, open it. You can copy the files from your unpacked assets over. There should be default.frame , layer1.png , layer2.png respawnsurvival.cinematic and respawncasual.cinematic. Edit the pictures however you want, open up the casual and survival repsawn files and look for lines that look like this
    "image" : "/cinematics/respawn/SPECIES/layer1.png:<frame>"
    I don't think this is too important, if at all, if you didn't change the layer 1 and 2 png files.

    Step 7

    Go back to your cinematics folder and open up the story folder. Make a folder called smallship and copy a set of files from the unpacked assets folder over. Should be something like SPECIESship, SPECIESship2, SPECIESship3 SPECIESship4 and default.frame. Edit them if you want, I didn't.

    Step 8

    Back to cinematics and open up your teleport folder. Copy a set of files over which should include teleport_yourspecies.cinematic , up_yourspecies.frame , warpdown_yourspecies.frame, up_yourspecies.png and warpdown_yourspecies.png

    Edit them however you want, then open the teleport_yourspecies file and look for 2 lines

    "image" : "/cinematics/teleport/up_yourspecies.png:<frame>"
    "image" : "/cinematics/teleport/warpdown_yourspecies.png:<frame>"

    just change the species part to match your species name.

    Step 9

    Go back into your mod folder and make a codex folder. Inside there make a folder named yourspecies. Open it. The protectorate 1 and 2 codexs are already in the unpacked codex folder, we don't need to copy them over. Copy over one of the SPECIEScover.png files from the codex folder. I used one from the human folder. Edit it however you want. Copy over one of the CODEX files. Rename it YOURSPECIESdiary.codex Edit it, mine looks like this...


    {
    "id" : "wookiediary",
    "title" : "Kashyyyk",
    "description" : "About our home.",
    "icon" : "wookiecover1.png",
    "contentPages" : [
    "Kashyyyk was a temperate jungle planet orbiting around a single star located in the Mytaranor sector of the Mid Rim, and had a complement of three moons. Covered in wroshyr trees, it served as homeworld to the Wookiee species. ",

    "Native fauna such as Can-cells would influence the design of starships by the Wookiee inhabitants, while great cities such as Kachirho would be built into the planet's trees."
    ],
    "itemConfig" : {
    "rarity" : "common",
    "price" : 25
    }
    }

    Also in my codex/wookie folder, I have a desktop configuration setting file. I haven't figured out what, but it says
    [ViewState]
    Mode=
    Vid=
    FolderType=Generic

    If its useless, someone let me know and I'll remove it from the tutorial.

    Step 10

    Back to your mod folder. Make a folder called dialog. I don't know if all this is necessary, but it's how I learned, so here we go! you need to patch the following files. arrivedhome.config ,combat.config, converse.config, crewmember.config, fenerox.config, flee.config, grumble.config, guard.config, merchant.config and quest.config.

    Here is a list of what was added.

    arrivedhome.config

    [
    {
    "op": "add",
    "path": "/beacon/yourspecies",
    "value": {
    "default": [
    "I'm Back!",
    "Hello hello.",
    "Can I help you?"
    ],
    "yourspecies": [
    "Home sweet home.",
    "Hello my friend.",
    "Hows it going?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/rent/yourspecies",
    "value": {
    "default": [
    "A little from me to you.",
    "I am happy to help."
    ]
    }
    }
    ]


    combat.config

    [
    {
    "op": "add",
    "path": "/attack/yourspecies",
    "value": {
    "default": [
    "ROAR!",
    "GROWL!",
    "CHARGE!"
    ]
    }
    },
    {
    "op": "add",
    "path": "/killedTarget/yourspecies",
    "value": {
    "default": [
    "Bleeders are pathetic",
    "It has been done."
    ]
    }
    },
    {
    "op": "add",
    "path": "/lostTarget/yourspecies",
    "value": {
    "default": [
    "Hello?"
    ]
    }
    }
    ]


    converse.config

    [
    {
    "op": "add",
    "path": "/greeting/yourspecies",
    "value": {
    "default" : [
    "Heya",
    "Howdy",
    "Heya! I am <selfname>",
    "How are you my friend?"
    ],
    "avian" : [
    "Heya",
    "Howdy",
    "Hiya my feathered friend",
    "Heya! I am <selfname>",
    "Howdy Howdy Howdy."
    ],
    "floran" : [
    "Heya",
    "Howdy",
    "Hiya my leafy friend",
    "Heya! I am <selfname>",
    "Howdy Howdy Howdy."
    ],
    "human" : [
    "...",
    "Hi.",
    "Hello."
    ],
    "hylotl" : [
    "Heya",
    "Howdy",
    "Hiya my fishy friend",
    "Heya! I am <selfname>",
    "Howdy Howdy Howdy."
    ],
    "novakid" : [
    "Heya",
    "Howdy",
    "Hiya glowing being.",
    "Heya! I am <selfname>",
    "Howdy Howdy Howdy."
    ],
    "yourspecies" : [
    "Heya",
    "Howdy",
    "Hiya Furball",
    "Heya! I am <selfname>",
    "Howdy Howdy Howdy."
    ]
    }
    },
    {
    "op": "add",
    "path": "/converse/yourspecies",
    "value": {
    "default" : [
    "Howdy Howdy Howdy",
    "We don't get too many visitors out here.",
    "Why are you here?"
    ],
    "apex" : [
    "You seem to be related to Humans, I do not like that.",
    "Are you going to throw barrels at me?",
    "Yes you do smell."
    ],
    "avian" : [
    "There are rabbit items in your tombs, why is that?",
    "Your beak is too close to my face.",
    "You don't eat meat do you?"
    ],
    "floran" : [
    "Does your plant matter feel pain?",
    "I find your rustling soothing.",
    "Do you turn orange in the Autumn months."
    ],
    "human" : [
    "Don't talk to me",
    "People like you, litter our world",
    "Go fluff yourself"
    ],
    "hylotl" : [
    "You look slimy.",
    "Are you thirsty?",
    "What brings you to the land?"
    ],
    "novakid" : [
    "Your glow pleases me.",
    "How do you see?",
    "Where do you come from?"
    ],
    "yourspecies" : [
    "Hello fellow yourspecies, I am glad to see you.",
    "What's up Buddy?",
    "It's great to see another yourspecies doing so well.",
    "Welcome!"

    ]
    }
    },
    {
    "op": "add",
    "path": "/converse/apex/yourspecies",
    "value": [
    "Do I smell? Please let me know if I do.",
    "I may be related to Humans, but please don't lump us with them.",
    "I take offence to being called Kong.",
    "Good day to you, my yourspecies friend.",
    "Don't sneak too much, cat. Miniknog is watching.",
    "Your freedom fills me with joy, friend",
    "My fur is in terrible shape, how do I make it look nice like yours?"
    ]
    },
    {
    "op": "add",
    "path": "/converse/avian/yourspecies",
    "value": [
    "In all the books in our libraries, I have never read about your race.",
    "I wish I could fly.",
    "It's okay, I only eat seeds.",
    "You look so lovely and fluffy.",
    "I don't know about the rabbit items in our tombs.",
    "Coo Coo",
    "I wish Avians were descended from rabbits, not birds"
    ]
    },
    {
    "op": "add",
    "path": "/converse/floran/yourspecies",
    "value": [
    "Floran greets stranger.",
    "Have nice day.",
    "Hello, fuzzy sstranger.",
    "How is sstranger person?",
    "Sssup new friend?",
    "Nice meeting you.",
    "Floran happy we met.",
    "Can Floran help you?",
    "Is sstranger ok?",
    "Welcome."
    ]
    },
    {
    "op": "add",
    "path": "/converse/glitch/yourspecies",
    "value": [
    "Eager. Salutations.",
    "Welcoming. I will always welcome new friends!",
    "Friendly. It is wonderful to meet you.",
    "Excited. Yay! A new fuzzy friend!",
    "Cordial. Hello my fine fuzzy fellow.",
    "Surly. Hi...",
    "Merry. Welcome, welcome, welcome!"
    ]
    },
    {
    "op": "add",
    "path": "/converse/human/yourspecies",
    "value": [
    "Don't hurt me please.",
    "I feel like it was mostly a huge misunderstanding.",
    "You know, I actually was on your side.",
    "You're so fluffy!",
    "I'm sorry for my people.",
    "We should have finished you off.",
    "Do you eat a lot of carrots?",
    "..."
    ]
    },
    {
    "op": "add",
    "path": "/converse/hylotl/yourspecies",
    "value": [
    "I got my 3 eyes on you.",
    "Well to me, you smell funny.",
    "You are overly fuzzy.",
    "Your ears are a work of art.",
    "We don't have to stay underwater like most people think.",
    "Do you produce art?",
    "Why do you hate the Human anyway?",
    "We are praised for our architecture."
    ]
    },
    {
    "op": "add",
    "path": "/converse/novakidyourspecies",
    "value": [
    "Howdy Howdy Howdy",
    "This town ain't big enough for the both of us.",
    "Howdy my fuzzy lil' partner.",
    "I can tell y'all aren't from around here."
    ]
    }
    ]


    crewmember.config

    [
    {
    "op": "add",
    "path": "/converse/yourspecies",
    "value": {
    "default": [
    "I look so amazing in this uniform.",
    "Howdy.",
    "Seen any good leathers lately? I'm asking for a friend."

    ]
    }
    }
    ]


    fenerox.config

    [
    {
    "op": "add",
    "path": "/converse/default/yourspecies",
    "value": [
    "New person. No Smell. Quite exciting!",
    "Odd person. Hopefully nice. Feeling cautious!",
    "Weird person. Not Fenerox. Being polite!",
    "Meeting stranger. Being friendly. New experience!",
    "Odd person. Saying hello. Not Fenerox?",
    "Friendly stranger. Feeling awkward. Cautiously optimistic!",
    "New stranger. Not confident. Saying hello!",
    "Unknown person. VeryFunny. Looking weird."
    ]
    }
    ]


    flee.config

    [
    {
    "op": "add",
    "path": "/helpme/yourspecies",
    "value": {
    "default": [
    "AAHHHH",
    "Help me!",
    "Raaaaaawr!"
    ]
    }
    /* },
    {
    "op": "add",
    "path": "/helpthem/yourspecies",
    "value": {
    "default": [
    "Hurm-Rawrgh.",
    "Graaaaagh"
    ]
    }
    },
    {
    "op": "add",
    "path": "/encourage/yourspecies",
    "value": {
    "default": [
    "Go! Go! Go!",
    "Woooo",
    "Huzzah!",
    "Roar!"
    ]
    }
    */ }
    ]


    grumble.config

    [
    {
    "op": "add",
    "path": "/tagCriteria/yourspecies",
    "value": {
    "default": [
    "Things have changed, and I do not care for it."
    ]
    }
    },
    {
    "op": "add",
    "path": "/enclosedArea/yourspecies",
    "value": {
    "default": [
    "This is not how I wanted this, fix it."
    ]
    }
    },
    {
    "op": "add",
    "path": "/otherDeed/yourspecies",
    "value": {
    "default": [
    "GROWL",
    "ROAR!"
    ]
    }
    },
    {
    "op": "add",
    "path": "/severe/yourspecies",
    "value": {
    "default": [
    "ROAR!",
    "You can fix this, or fight me."
    ]
    }
    },
    {
    "op": "add",
    "path": "/final/yourspecies",
    "value": {
    "default": [
    "THAT'S IT! I'm out!",
    "Nobody got time for this."
    ]
    }
    }
    ]


    guard.config

    [
    {
    "op": "add",
    "path": "/hail/yourspecies",
    "value": {
    "default": [
    "I got my eyes on you.",
    "Keep walking.",
    "Check yourself.",
    "Move along."
    ],
    "yourspecies": [
    "Hello.",
    "Look after yourself my friend.",
    "Good to see a fellow yourspecies.",
    "Hello."
    ]
    }
    }
    ]


    merchant.config

    [
    {
    "op": "add",
    "path": "/merchantStart/yourspecies",
    "value": {
    "default": [
    "Welcome to my store.",
    "How may I help you?",
    "Welcome welcome welcome."
    ]
    }
    },
    {
    "op": "add",
    "path": "/merchantEnd/yourspecies",
    "value": {
    "default": [
    "See you next time!",
    "Please come back soon",
    "Your pixels are always good here.",
    "Pleasure doing business with you!",
    "It was a pleasure having you here.",
    "Great to see you!",
    "Let's do business again."
    ]
    }
    },
    {
    "op": "add",
    "path": "/follow/yourspecies",
    "value": {
    "default": [
    "Right this way.",
    "Please follow me.",
    "Come with me."
    ]
    }
    },
    {
    "op": "add",
    "path": "/welcome/yourspecies",
    "value": {
    "default": [
    "Welcome!",
    "Let's talk business.",
    "Now that we are here, how can I help you?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/tout/yourspecies",
    "value": {
    "default" : [
    "Goods for sale!",
    "Hey you, come check out my amazing wares!",
    "Best deals around!",
    "Cheap buys!"
    ]

    }
    }
    ]


    quest.config

    [
    {
    "op": "add",
    "path": "/intimidate/intimidated/yourspecies",
    "value": {
    "default": [
    "Don't hurt me with that <item>! Tell <questGiver> I'll do anything!"
    ]
    }
    },
    {
    "op": "add",
    "path": "/intimidate/notIntimidated/yourspecies",
    "value": {
    "default": [
    "You and <questGiver> don't scare me",
    "Tell <questGiver>to go bone themselves."
    ]
    }
    },
    {
    "op": "add",
    "path": "/bribe/giftAccepted/yourspecies",
    "value": {
    "default": [
    "Oh ho ho, send my regards to <questGiver>.",
    "Bribing me? Okay great, tell <questGiver> I said thank you."
    ]
    }
    },
    {
    "op": "add",
    "path": "/bribe/giftAccepted2/yourspecies",
    "value": {
    "default": [
    "What does <questGiver> want from me?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/bribe/requestAdditionToHouse/yourspecies",
    "value": {
    "default": [
    "This is great! Can you place it in my home for me?",
    "This will go great in my home, can you put it somewhere nice?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/gift/giftAccepted/yourspecies",
    "value": {
    "default": [
    "How kind of <questGiver>. Tell them I said thank you",
    "Thank you!"
    ]
    }
    },
    {
    "op": "add",
    "path": "/gift/giftAccepted2/yourspecies",
    "value": {
    "default": [
    "<questGiver> is a great friend to me."
    ]
    }
    },
    {
    "op": "add",
    "path": "/gift/requestAdditionToHouse/yourspecies",
    "value": {
    "default": [
    "This is a great gift! Can you place it in my home for me?",
    "This gift will go great in my home, can you put it somewhere nice?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/return_stolen/objectTaken/yourspecies",
    "value": {
    "default": [
    "I dug <item> out of the ground fair and honest."
    ]
    }
    },
    {
    "op": "add",
    "path": "/collect_fine/fineCollected/yourspecies",
    "value": {
    "default": [
    "I don't want any trouble, I will pay the fine."
    ]
    }
    },
    {
    "op": "add",
    "path": "/collect_gift/giftProvided/yourspecies",
    "value": {
    "default": [
    "I hope <questGiver> is happy with <item>!."
    ]
    }
    },
    {
    "op": "add",
    "path": "/request_craft/giftProvided/yourspecies",
    "value": {
    "default": [
    "I hope <questGiver> likes their new <item>, I made it with my bare hands."
    ]
    }
    },
    {
    "op": "add",
    "path": "/borrow/giftProvided/yourspecies",
    "value": {
    "default": [
    "Here is the <item>, tell <questGiver> to look after it."
    ]
    }
    },
    {
    "op": "add",
    "path": "/extort/giftProvided/yourspecies",
    "value": {
    "default": [
    "Woah woah!"
    ]
    }
    },
    {
    "op": "add",
    "path": "/hat/crafting/yourspecies",
    "value": {
    "default": [
    "Great great, one moment and I will be right back with it made."
    ]
    }
    },
    {
    "op": "add",
    "path": "/hat/crafted/yourspecies",
    "value": {
    "default": [
    "Thank you for waiting. Take this to <questGiver> for me please."
    ]
    }
    },
    {
    "op": "add",
    "path": "/helmet/crafting/yourspecies",
    "value": {
    "default": [
    "Great great, one moment and I will be right back with it made."
    ]
    }
    },
    {
    "op": "add",
    "path": "/helmet/crafted/yourspecies",
    "value": {
    "default": [
    "Thank you for waiting. Take this to <questGiver> for me please."
    ]
    }
    },
    {
    "op": "add",
    "path": "/new_stock/trade/yourspecies",
    "value": {
    "default": [
    "Here is <questGiver>'s parcel, take it to them if you will."
    ]
    }
    },
    {
    "op": "add",
    "path": "/kidnapping/kidnappersDead/yourspecies",
    "value": {
    "default": [
    "Thank you for saving me my friend.",
    "I owe you my life."
    ]
    }
    },
    {
    "op": "add",
    "path": "/kidnapping/followHome/yourspecies",
    "value": {
    "default": [
    "I'm too scared to go alone, can you escort me to <questGiver>?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/escort/found/yourspecies",
    "value": {
    "default": [
    "Do you know the way to <questGiver>? Can you be my guide?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/barter/trade/yourspecies",
    "value": {
    "default": [
    "Thank you for the goods. Here's <questGiver>'s <receivedItems>."
    ]
    }
    },
    {
    "op": "add",
    "path": "/escort_trade/collectDelivery/yourspecies",
    "value": {
    "default": [
    "Do you have a parcel for me?"
    ]
    }
    },
    {
    "op": "add",
    "path": "/escort_trade/provideDelivery/yourspecies",
    "value": {
    "default": [
    "Here are your items my friend."
    ]
    }
    },
    {
    "op": "add",
    "path": "/kill_npcs/assistantIntro/yourspecies",
    "value": {
    "default": [
    "Hey Hey! <questGiver> is an old friend of mine, they sent me to help you with <enemy>."
    ]
    }
    },
    {
    "op": "add",
    "path": "/kill_npc/surrender/yourspecies",
    "value": {
    "default": [
    "You win, I will not fight you any longer."
    ]
    }
    },
    {
    "op": "add",
    "path": "/kill_npc/betray/yourspecies",
    "value": {
    "default": [
    "I can't believe you fell for that."
    ]
    }
    }
    ]


    As you patch those files, just go through and replace all instances of yourspecies with the name of your species. If your species has a special way of talking, look through the files and figure out what text is coming from your species and edit it to match your species speech patterns. If all those files aren't necessary, someone let me know and I'll tag which ones aren't.

    Step 11
    Take a break! Whew!

    Step 12

    Back into your mod folder, make a new folder called humanoid. Make a folder inside that folder called any. Copy over the frame files from the unpacked humanoid folder. It should include..
    backarm, emote, femalebody, femlaehead, flames, frontarm, malebody, and malehead frame files.

    Step 13

    Back into the humanoid folder. Make a new folder named yourspecies. Copy over one of the existing unpacked species. I used human as a template for mine. You should have a Hair folder and png for backarm, frontarm, male/female body and male/female head, emote, and a dead icon.

    Take your time and open up each of the png files and use the bodies there as templates to design your species. If you need to know how big each frame is, just open the frame file in the "any" folder that matches the png. Here is an example for the malebody frame file...


    {
    "frameGrid" : {
    "size" : [43, 43],
    "dimensions" : [9, 6],

    "names" : [
    [ null, "idle.1", "idle.2", "idle.3", "idle.4", "idle.5", "sit.1", null, "duck.1" ],
    [ null, "walk.1", "walk.2", "walk.3", "walk.4", "walk.5", "walk.6", "walk.7", "walk.8" ],
    [ null, "run.1", "run.2", "run.3", "run.4", "run.5", "run.6", "run.7", "run.8" ],
    [ null, "jump.1", "jump.2", "jump.3", "jump.4", "fall.1", "fall.2", "fall.3", "fall.4" ],
    [ null, "climb.1", "climb.2", "climb.3", "climb.4", "climb.5", "climb.6", "climb.7", "climb.8" ],
    [ null, "swimIdle.1", null, null, "swim.1", "swim.2", "swim.3", "swim.4" ]
    ]
    },
    "aliases" : {
    "swimIdle.2" : "swimIdle.1",
    "swim.5" : "swimIdle.1",
    "swim.6" : "swimIdle.1",
    "swim.7" : "swimIdle.1",
    "lay.1" : "run.8"
    }
    }



    The size lets you know its width then the height. So 43,43 means its 43 pixels wide and tall. Dimensions lets you know the columns and rows. 9,6 means there is 9 columns, each with 6 rows. The names let you know which each frame is named.

    Step 14

    Back to your mod folder. Make a folder and name is interface. Inside that folder make a folder named title. In that folder make a 25x24 png and draw a small picture of your species from about the chest to the head. If your female and male's are different, make 2 png's and name them after your species with male and female at the end, or something like wookieM and wookieF. These are for the character select screen when you switch between male and female.

    Step 15

    Go back into your interface folder and make a new folder called windowconfig.
    Open that folder and make a patch file for charcreation.config. It should read like this..


    [
    { "op" : "add", "path" : "/speciesOrdering/-", "value" : "yourspecies" }
    ]


    Step 16

    Back to your mod folder. Make a folder and name is quest. Open that folder and make a patch for the quest.config. It should look like this...

    [
    {
    "op": "add",
    "path": "/initialquests/yourspecies",
    "value": [ "protectorate" ]
    }
    ]


    Step 17 (Optional)

    If you have any custom sounds effects for when your species is hard, go back into the mod folder and make a folder called sfx. Open it and make a new folder called humanoid. Open it and put your file in there. I made sure my file was .ogg , if yours is not, there are free online converters to change file formats.

    Step 18

    Back to the mod folder. Make a new folder called ships. Open it and make a folder name yourspecies. Open it. Go into the unpacked assets ships/human folder and copy everything over. If you plan on making a custom startertreasure (more on that at the end of the guide) you will need to open the blockkey.config and change the starter treasure to match your species name. (Step 24 if you want to skip ahead and do that, then come back to Step 19)

    Step 19

    Back to your mod folder, make a new folder name species. Open it.
    Copy over one of the species files, once again, I used human. Then copy over the namegen files. You'll notice some have male/female name gens, some have only one. I copied one of each for mine. Rename the files so they match your species. Open them and edit the names all you want.

    Step 20

    Open the species file after you have renamed it. Change everything to match your species. It should look something like this...


    {
    "kind" : "human",

    "charCreationTooltip" : {
    "title" : "Yourspecies",
    "subTitle" : "O2",
    "description" : "Put a description of your species here."
    },

    "nameGen" : [ "/species/YOURSPECIESmalenamegen.config:names", "/species/YOURSPECIESfemalenamegen.config:names" ],
    "ouchNoises" : [ "/sfx/humanoid/humanhurt_male1.ogg", "/sfx/humanoid/humanhurt_female1.ogg" ],
    "charGenTextLabels" : [ "Skin colour", "Hair style", "Shirt", "Legwear", "Underwear", "Hair colour", "Shirt colour", "Legwear colour", "YOURSPECIES", "Personality" ],
    "skull" : "/humanoid/yourspecies/dead.png",
    "effectDirectives" : "?replace=FEFFFFFF=FFFFFFFF?replace=9bd4ffFF=ffea63FF?replace=31a6ffFF=f5bc00FF",
    "defaultBlueprints" : {
    "tier1" : [

    // Empty Hands
    { "item" : "flaghuman" },

    // Anvil
    { "item" : "humantier1head" },
    { "item" : "humantier1chest" },
    { "item" : "humantier1pants" },
    { "item" : "humantier2head" },
    { "item" : "humantier2chest" },
    { "item" : "humantier2pants" },

    { "item" : "ironshortsword" },
    { "item" : "ironbroadsword" },
    { "item" : "tungstenaxe" },
    { "item" : "tungstenhammer" },

    // Anvil2
    { "item" : "humantier3head" },
    { "item" : "humantier3chest" },
    { "item" : "humantier3pants" },
    { "item" : "humantier4head" },
    { "item" : "humantier4chest" },
    { "item" : "humantier4pants" },

    { "item" : "titaniumdagger" },
    { "item" : "titaniumspear" },
    { "item" : "durasteelbroadsword" },
    { "item" : "durasteelshortsword" },

    // Anvil3
    { "item" : "humantier5ahead" },
    { "item" : "humantier5achest" },
    { "item" : "humantier5apants" },
    { "item" : "humantier6ahead" },
    { "item" : "humantier6achest" },
    { "item" : "humantier6apants" },

    { "item" : "humantier5mhead" },
    { "item" : "humantier5mchest" },
    { "item" : "humantier5mpants" },
    { "item" : "humantier6mhead" },
    { "item" : "humantier6mchest" },
    { "item" : "humantier6mpants" },

    { "item" : "humantier5shead" },
    { "item" : "humantier5schest" },
    { "item" : "humantier5spants" },
    { "item" : "humantier6shead" },
    { "item" : "humantier6schest" },
    { "item" : "humantier6spants" },

    { "item" : "aegisaltpistol" },
    { "item" : "aegisaltbow" },
    { "item" : "feroziumwand" },
    { "item" : "feroziumstaff" },
    { "item" : "violiumshortsword" },
    { "item" : "violiumbroadsword" },

    // Furniture Table 2
    { "item" : "humanstoragelocker" },
    { "item" : "humanshipdoor" },
    { "item" : "humanshiphatch" },

    // Spinning Wheel
    { "item" : "conceptchest" },
    { "item" : "conceptlegs" },
    { "item" : "coolchest" },
    { "item" : "coollegs" },
    { "item" : "sweatervestchest" },
    { "item" : "sweatervestlegs" },
    { "item" : "workoutchest" },
    { "item" : "workoutlegs" }
    ]
    },
    "altOptionAsUndyColor" : true,
    "headOptionAsHairColor" : true,
    "altOptionAsHairColor" : true,
    "genders" : [
    {
    "name" : "male",
    "image" : "/interface/title/YOURSPECIESmale.png",
    "characterImage" : "/interface/title/humanmale.png",
    "hair" : [ "male1", "male2", "male3", "male4", "male5", "male6", "male7", "male8", "male9", "male10", "male11", "male12", "male13", "male14", "male15", "male16", "male17", "male18", "male19", "male21", "male22", "male23", "male24", "male25", "male26", "male27", "male28", "male29", "male30", "male31", "male32", "male33", "male34", "male35", "male36", "male37", "male38", "male39", "male40", "male41", "male42", "male43", "male44", "male45", "male46", "male47", "male48", "male49", "male50", "male51", "male52", "male53", "male54", "male55", "male56", "male57", "male58", "male59", "male60", "male61", "male62", "male63", "male64" ],
    "shirt" : [ "workoutchest", "coolchest", "conceptchest", "sweatervestchest", "hoodiechest", "hoodiechest2", "protectorateshirtchest", "protectoratevestchest" ],
    "pants" : [ "workoutlegs", "coollegs", "conceptlegs", "sweatervestlegs", "jeans1legs", "jeans2legs", "jeans3legs" ],
    "facialHairGroup" : "",
    "facialHair" : [ ],
    "facialMaskGroup" : "",
    "facialMask" : [ ]
    },
    {
    "name" : "female",
    "image" : "/interface/title/YOURSPECIESfemale.png",
    "characterImage" : "/interface/title/humanfemale.png",
    "hair" : [ "fem1", "fem2", "fem3", "fem4", "fem5", "fem6", "fem7", "fem8", "fem9", "fem10", "fem11", "fem12", "fem13", "fem14", "fem15", "fem16", "fem17", "fem18", "fem19", "fem20", "fem21", "fem22", "fem23", "fem24", "fem25", "fem26", "fem27", "fem28", "fem29", "fem30", "fem31", "fem32", "fem33", "fem34", "fem35", "fem36", "fem37", "fem38", "fem39", "fem40", "fem41", "fem42", "fem43", "fem44", "fem45", "fem46", "fem47", "fem48", "fem49", "fem50", "fem51", "fem52", "fem53", "fem54", "fem55", "fem56", "fem57", "fem58", "fem59", "fem60", "fem61", "fem62", "fem63", "fem64" ],
    "shirt" : [ "workoutchest", "coolchest", "conceptchest", "sweatervestchest", "hoodiechest", "hoodiechest2", "protectorateshirtchest", "protectoratevestchest" ],
    "pants" : [ "workoutlegs", "coollegs", "conceptlegs", "sweatervestlegs", "jeans1legs", "jeans2legs", "jeans3legs" ],
    "facialHairGroup" : "",
    "facialHair" : [ ],
    "facialMaskGroup" : "",
    "facialMask" : [ ]
    }
    ],
    "bodyColor" : [
    { "ffe2c5" : "ab8c77", "ffc181" : "86644a", "d39c6c" : "684431", "c7815b" : "40271d" },
    { "ffe2c5" : "c5ad98", "ffc181" : "a47a59", "d39c6c" : "865d40", "c7815b" : "66412e" },
    { "ffe2c5" : "e1b98d", "ffc181" : "c88959", "d39c6c" : "9e6a4d", "c7815b" : "784930" },
    { "ffe2c5" : "c9b181", "ffc181" : "ac8348", "d39c6c" : "87633f", "c7815b" : "694c31" },
    { "ffe2c5" : "e8cebc", "ffc181" : "cfa97d", "d39c6c" : "ae774b", "c7815b" : "804e34" },
    { "ffe2c5" : "f4e0ba", "ffc181" : "e9b768", "d39c6c" : "c18f54", "c7815b" : "a2683d" },
    { "ffe2c5" : "ffe9d3", "ffc181" : "ffc181", "d39c6c" : "d39c6c", "c7815b" : "b97551" },
    { "ffe2c5" : "fbe1d4", "ffc181" : "f6baa2", "d39c6c" : "cc9582", "c7815b" : "ac7261" },
    { "ffe2c5" : "fff7ec", "ffc181" : "f9d3a9", "d39c6c" : "d3a57c", "c7815b" : "b37c5d" },
    { "ffe2c5" : "fff6f6", "ffc181" : "f7d5d3", "d39c6c" : "d1aaa1", "c7815b" : "a27f70" }
    ],
    "undyColor" : [
    { "dc1f00" : "4d76ad", "be1b00" : "395187", "951500" : "20325b" },
    { "dc1f00" : "7c41b8", "be1b00" : "6c2f90", "951500" : "471962" },
    { "dc1f00" : "c63442", "be1b00" : "9b2724", "951500" : "6a1210" },
    { "dc1f00" : "eaa245", "be1b00" : "b47020", "951500" : "834a0c" },
    { "dc1f00" : "e3e13a", "be1b00" : "a8a614", "951500" : "848008" },
    { "dc1f00" : "6ab841", "be1b00" : "45902f", "951500" : "296219" },
    { "dc1f00" : "535353", "be1b00" : "363636", "951500" : "111111" },
    { "dc1f00" : "e6e6e6", "be1b00" : "979797", "951500" : "6f6f6f" },
    { "dc1f00" : "9e9e9e", "be1b00" : "6e6e6e", "951500" : "434343" },
    { "dc1f00" : "f794f8", "be1b00" : "d355c1", "951500" : "b72c95" }
    ],
    "hairColor" : [
    //LIGHT RED
    { "d9c189" : "E86D46", "a38d59" : "D1422E", "735e3a" : "96201B" },
    //RED
    { "d9c189" : "CD1C38", "a38d59" : "982441", "735e3a" : "69243F" },
    //DARK RED
    { "d9c189" : "ad2716", "a38d59" : "8f1f1b", "735e3a" : "731a1a" },
    //RUSTY RED
    { "d9c189" : "BE471B", "a38d59" : "9B2F0C", "735e3a" : "702710" },
    //BROWN
    { "d9c189" : "7d3c1c", "a38d59" : "4d240b", "735e3a" : "2d1606" },
    //LIGHT BROWN
    { "d9c189" : "7f5a39", "a38d59" : "5b3523", "735e3a" : "3b1f15" },
    //DIRTY ORANGE
    { "d9c189" : "a6671d", "a38d59" : "915622", "735e3a" : "743e1d" },
    //ORANGE
    { "d9c189" : "efa838", "a38d59" : "be6d1d", "735e3a" : "834012" },
    //DIRTY BLONDE
    { "d9c189" : "eaa758", "a38d59" : "cd8b3d", "735e3a" : "93682c" },
    //YELLOW
    { "d9c189" : "e6e756", "a38d59" : "c7ac3f", "735e3a" : "a9882f" },
    //BLONDE
    { "d9c189" : "f1d992", "a38d59" : "daba5e", "735e3a" : "b59a4d" },
    //LIGHT YELLOW
    { "d9c189" : "f2eba3", "a38d59" : "dcd28c", "735e3a" : "c2b677" },
    //LIGHT GREEN
    { "d9c189" : "A7D13D", "a38d59" : "83AD22", "735e3a" : "6B880B" },
    //GREEN
    { "d9c189" : "4ece61", "a38d59" : "34ae47", "735e3a" : "228a38" },
    //DARK GREEN
    { "d9c189" : "3b7f44", "a38d59" : "2e6a38", "735e3a" : "1d4b28" },
    //TORQUOISE
    { "d9c189" : "5BD5B6", "a38d59" : "4AA9AD", "735e3a" : "237082" },
    //LIGHT TURQUOISE
    { "d9c189" : "49E193", "a38d59" : "3BA380", "735e3a" : "197C81" },
    //LIGHT BLUE
    { "d9c189" : "61BCDE", "a38d59" : "5381CC", "735e3a" : "2C489E" },
    //BLUE
    { "d9c189" : "5d8bc7", "a38d59" : "4d55b0", "735e3a" : "2e2a73" },
    //DARK BLUE
    { "d9c189" : "425879", "a38d59" : "343965", "735e3a" : "242247" },
    //DARK PURPLE
    { "d9c189" : "7f3b6d", "a38d59" : "6a2e53", "735e3a" : "4b1d30" },
    //PURPLE
    { "d9c189" : "653b7f", "a38d59" : "562e6a", "735e3a" : "3f1d4b" },
    //HOT PINK
    { "d9c189" : "cd72d9", "a38d59" : "ac4da6", "735e3a" : "913b86" },
    //PINK
    { "d9c189" : "D26BA4", "a38d59" : "A54669", "735e3a" : "89334D" },
    //LIGHT PURPLE
    { "d9c189" : "ad68e2", "a38d59" : "8d41b0", "735e3a" : "6a2980" },
    //BROWN GREY
    { "d9c189" : "50422f", "a38d59" : "36261e", "735e3a" : "170f0d" },
    // DARK GREY
    { "d9c189" : "525252", "a38d59" : "363636", "735e3a" : "161616" },
    // GREY
    { "d9c189" : "74726f", "a38d59" : "53504d", "735e3a" : "2a251e" },
    // GREY BLUE
    { "d9c189" : "6f6d85", "a38d59" : "525269", "735e3a" : "3e4352" },
    // LIGHT GREY
    { "d9c189" : "b8b8b8", "a38d59" : "828282", "735e3a" : "555555" },
    // WHITE
    { "d9c189" : "eaeaea", "a38d59" : "b8b8b8", "735e3a" : "828282" }
    ]
    }



    You can tinker around and remove unwanted clothing options, what crafting recipes they know, etc.

    Step 21

    Back to the Mod folder. Make a folder called tenants. Create a patch file for villager_random.tenant


    [
    {
    "op":"add",
    "path":"/tenants/0/species/-",
    "value":"wookie"
    }
    ]


    Step 22

    Back into your mod folder and make a new text file named after your mod. It will be a modinfo file, so mine is named starwarsmod.modinfo
    It looks like this..

    {
    "name" : "Star Wars Mod",
    "version" : "v1.2.3",
    "path" : ".",
    "requires" : [],
    "includes" : [],
    "metadata":
    {
    "author" : "ProjectMayhem",
    "version" : "1.0",
    "description" : "Star Wars mod for Starbound",
    "support_url" : ""
    }
    }


    Changed everything to match your mod.

    Step 23

    In your mod folder make a _metadata file. It should look like this

    {
    "author" : "Projectmayhem",
    "description" : "Star Wars mod for Starbound",
    "friendlyName" : "Star Wars Mod",
    "name" : "Star Wars Mod",
    "version" : "1"
    }


    Once again, edit to match your mod.

    Step 24 (Optional)

    In your mod folder, create a folder called treasure. Open it. In that folder you need to make a patch file for shiplocker.treasurepools, It should look like this

    [
    {
    "op": "add",
    "path": "/yourspeciesStarterTreasure",
    "value": [[0, {
    "fill" : [
    {"item" : [ "flashlight" ]},
    {"item" : [ "torch", 10 ]},
    {"item" : [ "cannedfood", 1 ]},
    {"item" : [ "cannedfood", 1 ]},
    {"item" : [ "cannedfood", 1 ]},
    {"item" : [ "cannedfood", 1 ]}
    ]
    }]]
    }
    ]



    You can deleted items and add items. Just make sure to always have a comma after each item until the last one. For example, if you have a custom sword you want your species to start out with, you can add
    {"item" : ["yourswordsname", quantity ]}

    ***IMPORTANT***
    If you make a custom treasurepool. you need to find your blockkey.config file in your ship folder. Look for this piece of code and change yourspecies to whatever you named your starterpool.


    "object" : "humanshiplocker",
    "objectParameters" : {
    "treasurePools" : [ "yourspeciesStarterTreasure" ],
    "level" : 0.5,
    "unbreakable" : true
    },


    Note, it may not say humanshiplocker if you copied a different race folder or if you made your own shiplocker.


    Step 25

    In your mod folder, create a folder called quest. In it, you need to patch the quest.config file like this


    [
    {
    "op": "add",
    "path": "/initialquests/yourspecies",
    "value": [
    "protectorate"
    ]
    }
    ]


    Your custom species should now work. There are a few more files for my wookie, that I didn't have for my other species, so I think they are un-necessary.

    If anything here is wrong, or not needed, leave a comment and I'll tag it as optional or remove it.

    If you have trouble, can you download my mod and browse through the files, see how I have everything set up. Just look for everything with wookie in the name.

    http://community.playstarbound.com/resources/star-wars-mod.4583/[/spoiler]
     
    Last edited: Apr 7, 2018
    Cryptoid, DrPvtSkittles and xaliber like this.
  2. Exilyth

    Exilyth Scruffy Nerf-Herder

    Nice tutorial.

    The following is entirely optional.

    Something to note is that adding the starter treasure for the shiplocker from the base game as a pool to yourspecies own starter treasure makes it a lot easier for other mods to add stuff to yourspecies ship locker (the "visit us!" flyer from frackin' universe comes to mind). This also means that when the devs change the starting loot, yourspecies will automagically get the new stuff without you having to go and edit it in.

    The file from the base game is: unpacked_assets/treasure/shiplocker.treasurepools
    The treasure pool "starterTreasure" contains the flashlight, ten torches and 4 cans of canned food you find in the shiplocker at the start of the game.

    The way the starter treasure is added to a species specific starter treasure:
    Code:
    "yourspeciesStarterTreasure" : [
        [0, {
          "fill" : [
            {"pool" : "starterTreasure"}
          ]
        }]
      ]
    The "yourspeciesStarterTreasure" then needs to be set as the starter treasure of yourspecies.
    You could then add other starting items for yourspecies to the species specific treasure pool without making them appear in the ship locker of other species.
     
    Last edited: Mar 25, 2017
    Eralia, xaliber and projectmayhem like this.
  3. projectmayhem

    projectmayhem Spaceman Spiff

    Thank you, added it! And I updated it to include patching the quest.config o give yourself the starting quest
     
  4. NicBOMB

    NicBOMB Void-Bound Voyager

    What a way to start a post... I keep having the same problem. I unpacked my assets but in the \Starbound\UnpackedAssets\humanoid folder, all I see is the dances subfolder. Anything I can get help with? Capture.PNG
     
  5. IHart

    IHart Scruffy Nerf-Herder

    Typically this occurs when you close the unpacker too soon. Give it a couple of minutes.
     
  6. MadamHeichou

    MadamHeichou Scruffy Nerf-Herder

    in one of the first steps it says MAKE .patch file, how tf do i do that?
     
  7. projectmayhem

    projectmayhem Spaceman Spiff

    when you click show spoiler you will see the coding you need
    Code:
    [
    { "op" : "add", "path" : "/defaultCodexes/wookie", "value" : [ "protectorate1", "protectorate2", "wookiediary" ] },
    ]
    when you need to do is replace wookie with whatever you race is called, then save all that text to a file called player.config.patch

    All patch files are named after the file they are patching, but with .patch on the end.
    If you need anymore help let me know. And if you are someone who much prefers artwork to coding, I never mind doing the coding for people. Ive made enough races that I go through it pretty quickly now.
     
  8. smorgasmackan

    smorgasmackan Aquatic Astronaut

    When I follow this guide starbound keeps crashing. I have tried 2 times from scratch. PLZ help me.
     

Share This Page