Jump to content

Welcome to Obsidian Forum Community
Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, post status updates, manage your profile and so much more. If you already have an account, login here - otherwise create an account for free today!
Photo

First Mod (spoilers)


  • Please log in to reply
67 replies to this topic

#41
Kexby

Kexby

    (2) Evoker

  • Members
  • 72 posts
  • Location:Australia

Heheh I've just tested it again.

 

This is insanely fun, it's a total cheat! I'm having a blast (literally :biggrin: ).

 

There is just one final step I'd like to do. At the moment, it still has the original Additional Effects:

 

Additional Effects

 

Inaccurate: -10 Ranged Accuracy

Fine: +15% Damage, +4 Accuracy, +1 Penetration

Explosive Shot: Basic attacks deal the best of Pierce or Slash damage in a small AoE

 

I'd like to keep Fine and Explosive Shot, but get rid of Inaccurate.

 

Are the 'Additional Effects' in this section of the code?

 

"ItemModsIDs": ["fea57a9e-7dc1-4f66-8617-1e2f87c0f376", "7d7b81f7-7322-441f-a366-5d15d30379f5", "2dcb5f72-2a69-45c6-a438-3e93a58459a5"],

 

If so, then I'm guessing that the first entry is for Inaccurate. If I simply delete that first ID, will it remove Inaccurate from my Blunderbuss?

 

Thank you all so much for your help. I'm almost done (I promise).



#42
house2fly

house2fly

    (8) Warlock

  • Members
  • 1163 posts
Yep, those are the additional effects. I'm not sure if they're in order, but you can search for the UUID in the game's items.gamedatabundle to confirm the name. there'll probably be a million entries so try ID": "[UUID]".

If you make a weapon or armour you can of course make enchantments as well, which is not really more advanced but requires a lot more copying and assigning new UUIDs. To make a new enchantments you need an itemmod which has an ability or a statuseffect which could require an attack, and maybe you want to make a recipe for it, etc

#43
Kexby

Kexby

    (2) Evoker

  • Members
  • 72 posts
  • Location:Australia

Aha! Yep, I found it. The first ID is for Inaccurate, so I simply deleted it (which did the trick, my blunderbuss no longer has the Inaccurate modifier :)).

 

Well, I actually think I'm finished with this mod. Yay for me! And BIG thank you's to everybody who helped. You guys are awesome!

 

Here's the final BadAss.gamedatabundle (if anybody is interested):

{
	"GameDataObjects": [{
			"$type": "Game.GameData.WeaponGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_U_BadAss",
			"ID": "ea4de19d-d80c-4e66-9e33-8818a1e038a3",
			"Components": [{
					"$type": "Game.GameData.ItemComponent, Assembly-CSharp",
					"DisplayName": 66650,
					"DescriptionText": 66651,
					"FilterType": "Weapons",
					"InventoryAudioEventListID": "57518815-1aa8-49c2-8ee0-0d361b26fd66",
					"IsQuestItem": "false",
					"IsIngredient": "false",
					"IsCurrency": "false",
					"IsAdventuringItem": "false",
					"CanSellForFullValue": "false",
					"MaxStackSize": 1,
					"NeverDropAsLoot": "false",
					"CanBePickpocketed": "true",
					"IsUnique": "true",
					"Value": 35,
					"IconTextureSmall": "gui/icons/items/weapons/blunderbuss/blunderbuss_01_s.png",
					"IconTextureLarge": "gui/icons/items/weapons/blunderbuss/blunderbuss_01_l.png",
					"PencilSketchTexture": "",
					"InspectOnUseButton": [],
					"IsPlaceholder": "false"
				}, {
					"$type": "Game.GameData.EquippableComponent, Assembly-CSharp",
					"EquipmentType": "Blunderbuss",
					"EquipmentSlot": "AnyWeapon",
					"AppearancePiece": {
						"ModelVisualDataPath": "prefabs/items/appearance/weapons/blunderbuss/a_blunderbuss03_v01.asset"
					},
					"ItemModsIDs": ["7d7b81f7-7322-441f-a366-5d15d30379f5", "2dcb5f72-2a69-45c6-a438-3e93a58459a5"],
					"OnEquipVisualEffects": [],
					"RestrictedToClass": [],
					"RestrictedToPlayer": "false",
					"ProficientAbilityID": "f5a2eb61-8c11-41ab-9832-5ad182e5b368",
					"CannotUnequip": "false",
					"ItemRendererPrefab": "prefabs/itemrenderers/genericanimateditemrenderer.prefab",
					"ItemModel": "",
					"AnimationController": "art/animation/animationcontrollers/weapon/w_pistol.controller",
					"PaperdollOverrideRenderer": "",
					"AttackSummonID": "00000000-0000-0000-0000-000000000000",
					"CannotSheathe": "false",
					"PropVisualEffects": []
				}, {
					"$type": "Game.GameData.WeaponComponent, Assembly-CSharp",
					"Stance": "OneHanded",
					"AnimationStanceID": "ddeda306-872b-4d63-8032-fbaf359d0ed2",
					"StatusEffectsOnLaunchIDs": [],
					"IsDisplayedWhenAlternate": "true",
					"IsUniversalType": "false",
					"AttackID": "75e41a87-9eb2-4062-8127-f8f2b121a9e3",
					"NoiseLevelID": "6bfdad12-a1d0-42cc-b797-c9d2dac2af05",
					"ForceBackScabbard": "false",
					"ScabbardAppearancePiece": {
						"ModelVisualDataPath": ""
					},
					"ScabbardRendererPrefab": "",
					"ScabbardModel": "",
					"AudioEventListID": "00000000-0000-0000-0000-000000000000"
				}
			]
		},{
			"$type": "Game.GameData.AttackFirearmGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_BadAss",
			"ID": "75e41a87-9eb2-4062-8127-f8f2b121a9e3",
			"Components": [{
					"$type": "Game.GameData.AttackBaseComponent, Assembly-CSharp",
					"KeywordsIDs": ["f25230f4-fca2-44af-b745-03f026152459", "1b6d77c8-1155-4d49-9c7c-548716f0d409"],
					"AttackDistance": 88,
					"MinAttackDistance": 0,
					"AttackVariationID": "7da22f9e-cd53-4546-86cc-c2d150df72cb",
					"CastSpeedID": "eacb53e3-6eb5-422a-92ca-99cc883ae4a9",
					"RecoveryTimeID": "039ef4b4-eeb3-42d3-9817-a8df05c53515",
					"ImpactDelay": 0,
					"ForcedTarget": "None",
					"AffectedTargetType": "All",
					"AffectedTargetConditional": {
						"Conditional": {
							"Operator": 0,
							"Components": []
						}
					},
					"AffectedTargetDeathState": "Alive",
					"HostilityOverride": "Default",
					"PushDistance": 0,
					"FaceTarget": "true",
					"AccuracyBonus": 666,
					"PenetrationRating": 666,
					"DamageData": {
						"DamageType": "Pierce",
						"AlternateDamageType": "None",
						"Minimum": 666,
						"Maximum": 666,
						"DamageProcs": []
					},
					"Require****Object": "true",
					"StatusEffectKeywordsIDs": [],
					"StatusEffectsIDs": [],
					"RandomizeStatusEffect": "false",
					"CanGraze": "false",
					"CanCrit": "true",
					"DefendedBy": "Deflect",
					"AfflictionsDefendedBy": "None",
					"AfflictionApplicationModifier": "None",
					"SubstituteHitVisualEffect": "",
					"VisualEffects": [{
							"VisualEffect": "prefabs/effects/items/weapons/fx_action_flash_launch_01.prefab",
							"AttachPoint": "Fx_Bone_02",
							"AttachObject": "Caster",
							"AttachMode": "Attach",
							"MeshType": "None",
							"Event": "OnAnimEvent",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_muzzle_flash_launch_blunderbuss.prefab",
							"AttachPoint": "Fx_Bone_01",
							"AttachObject": "Caster",
							"AttachMode": "PositionRotation",
							"MeshType": "None",
							"Event": "OnLaunch",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}, {
							"VisualEffect": "prefabs/effects/items/weapons/fx_arquebus_smoke_linger.prefab",
							"AttachPoint": "Fx_Bone_01",
							"AttachObject": "Caster",
							"AttachMode": "Attach",
							"MeshType": "None",
							"Event": "OnLaunch",
							"AnimEventID": 0,
							"Loop": "false",
							"Scale": "false"
						}
					],
					"AttackOnImpactID": "00000000-0000-0000-0000-000000000000",
					"ExtraAttackID": "00000000-0000-0000-0000-000000000000",
					"LaunchBone": "Fx_Bone_01",
					"HitBone": "Chest",
					"OnHitShakeDuration": "None",
					"OnHitShakeStrength": "None",
					"NoiseLevelID": "82bc1ce9-3a81-41ca-a61a-cc1f73a53de7",
					"AllReactNoise": "false",
					"InterruptsOn": "None",
					"InterruptType": "Normal",
					"TargetAngle": 0,
					"ApplyOnceOnly": "false",
					"PathsToTarget": "true",
					"HideFromCombatLog": "false",
					"DoesNotApplyDamage": "false",
					"TreatAsWeapon": "false",
					"BounceData": {
						"Bounces": 0,
						"Multiplier": 0.5,
						"Range": 4,
						"InRangeOrder": "true",
						"NoRepeatTargets": "false",
						"AlwaysBounceAtEnemies": "true",
						"Delay": 0
					}
				}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 4,
					"IgnoreMagicDefense": "false",
					"ProjectileConeAngle": 11,
					"ProjectilePrefab": "prefabs/projectiles/invisible_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 88,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}, {
					"$type": "Game.GameData.AttackFirearmComponent, Assembly-CSharp",
					"ClipSize": 4,
					"ReloadTime": 2,
					"ReloadAnimationEndTime": 1.67,
					"FirearmType": "Pistol"
				}
			]
		},  {
			"$type": "Game.GameData.AttackAOEGameData, Assembly-CSharp",
			"DebugName": "Blunderbuss_BadAss_AoE",
			"ID": "dbb0a8d7-d06f-4d99-b396-30470f5b74b1",
			"Components": [{
					"$type": "Game.GameData.AttackBaseComponent, Assembly-CSharp",
					"KeywordsIDs": ["f25230f4-fca2-44af-b745-03f026152459", "1b6d77c8-1155-4d49-9c7c-548716f0d409"],
					"AttackDistance": 88,
					"MinAttackDistance": 0,
					"AttackVariationID": "35abdf41-fc3f-4310-8d5d-5d7da644affc",
					"CastSpeedID": "eacb53e3-6eb5-422a-92ca-99cc883ae4a9",
					"RecoveryTimeID": "566840d9-1561-4243-8ca7-889df9869847",
					"ImpactDelay": 0,
					"ForcedTarget": "None",
					"AffectedTargetType": "Hostile",
					"AffectedTargetConditional": {
						"Conditional": {
							"Operator": 0,
							"Components": []
						}
					},
					"AffectedTargetDeathState": "Alive",
					"HostilityOverride": "Default",
					"PushDistance": 0,
					"FaceTarget": "false",
					"AccuracyBonus": 666,
					"PenetrationRating": 666,
					"DamageData": {
						"DamageType": "Pierce",
						"AlternateDamageType": "Slash",
						"Minimum": 666,
						"Maximum": 666,
						"DamageProcs": []
					},
					"Require****Object": "false",
					"StatusEffectKeywordsIDs": [],
					"StatusEffectsIDs": [],
					"RandomizeStatusEffect": "false",
					"CanGraze": "false",
					"CanCrit": "true",
					"DefendedBy": "Reflex",
					"AfflictionsDefendedBy": "None",
					"AfflictionApplicationModifier": "None",
					"SubstituteHitVisualEffect": "",
					"VisualEffects": [],
					"AttackOnImpactID": "00000000-0000-0000-0000-000000000000",
					"ExtraAttackID": "00000000-0000-0000-0000-000000000000",
					"LaunchBone": "RightWeapon",
					"HitBone": "Chest",
					"OnHitShakeDuration": "None",
					"OnHitShakeStrength": "None",
					"NoiseLevelID": "15743f94-1026-40b0-8e13-a667b3f66f63",
					"AllReactNoise": "false",
					"InterruptsOn": "None",
					"InterruptType": "Normal",
					"TargetAngle": 0,
					"ApplyOnceOnly": "false",
					"PathsToTarget": "true",
					"HideFromCombatLog": "false",
					"DoesNotApplyDamage": "false",
					"TreatAsWeapon": "false",
					"BounceData": {
						"Bounces": 0,
						"Multiplier": 0.5,
						"Range": 10,
						"InRangeOrder": "false",
						"NoRepeatTargets": "false",
						"AlwaysBounceAtEnemies": "false",
						"Delay": 0
					}
				}, {
					"$type": "Game.GameData.AttackAOEComponent, Assembly-CSharp",
					"BlastSize": "Large",
					"BlastRadiusOverride": 5,
					"DamageAngle": 360,
					"ExcludePrimaryTarget": "true",
					"IgnoreParentTarget": "true",
					"ExcludeSelf": "false",
					"BlastPhysicsForce": 500,
					"PushFromCaster": "false"
				}, {
					"$type": "Game.GameData.AttackRangedComponent, Assembly-CSharp",
					"LaunchAttackOnCollision": "false",
					"ProjectileCount": 1,
					"IgnoreMagicDefense": "true",
					"ProjectileConeAngle": 145,
					"ProjectilePrefab": "prefabs/projectiles/invisible_projectile.prefab",
					"IsMultiHit": "false",
					"MultiHitTravelDist": 88,
					"MultiHitMaxHits": 0,
					"LaunchSource": "Caster",
					"LaunchOffset": {
						"x": 0,
						"y": 0,
						"z": 0
					},
					"LaunchOffsetRandom": {
						"x": 0,
						"y": 0,
						"z": 0
					}
				}
			]
		}
	]
}

I'm not sure if anybody wants an overpowered cheating blunderbuss, but should I upload it to Nexus? I'm just thinking it might help other newbie modders to see what I've done (cause studying other people's mods is a really big help when you're trying to learn).

 

I'd really like to attach it to this post, but I get this message:

 

Error You aren't permitted to upload this kind of file

 

I'm guessing this is because I'm new around here and don't have enough posting privileges yet :no: .


Edited by Kexby, 01 August 2018 - 07:08 PM.

  • kilay likes this

#44
kilay

kilay

    (5) Thaumaturgist

  • Members
  • 524 posts

Aha! Yep, I found it. The first ID is for Inaccurate, so I simply deleted it (which did the trick, my blunderbuss no longer has the Inaccurate modifier :)).
 
Well, I actually think I'm finished with this mod. Yay for me! And BIG thank you's to everybody who helped. You guys are awesome!

I'm not sure if anybody wants an overpowered cheating blunderbuss, but should I upload it to Nexus? I'm just thinking it might help other newbie modders to see what I've done (cause studying other people's mods is a really big help when you're trying to learn).

 

Now that you've understood the basic maybe you could refine your Blunderbuss Badass with a proper damage, other status effects and what you like. So people will have more interest to download it. 666 of damage and 88 of range is really too much. Add some visual effects to your weapon could be another good idea (there are lot of them).

Even you should get rid of the stringtables giving it proper name and some lore, checking in game that all is working properly.
But for that is better talk in other place (Slack or PM) without flood this thread.

Glad you sort out. Keep on it.


Edited by kilay, 01 August 2018 - 07:18 PM.


#45
Kexby

Kexby

    (2) Evoker

  • Members
  • 72 posts
  • Location:Australia

You're right Kilay, I shouldn't have flooded Peardox's thread (I'm sorry Peardox).

 

I just thought, if I posted my progress here on the official forum (instead of on Slack), then other beginners could follow it and hopefully learn something from it.

 

But I think I'll use Slack from now on (I just need to get the hang of using it :biggrin: ).



#46
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

I'm glad you liked it @Kexby

@Kilay (I think) expressed an interest in interest in expanding the Mod tutorials

 

I completely agree with him

Feel free to grab any of us in Slack

Here's @Kilay's PM to me

 

hey peardox , are you planning to make other tutorials? cuz i have in mind to make something more detailed about items (with itemmods, status effect, various attacks etc) (edited)

The answer is yep but I'm really busy on other crap

 

This appears a good learning curve for both you + @housefly to educate both yourselves and others

 

Ideally I'd like you on a shared project with an experienced member - @kilay, @tt1, @spherikal, @Ethics Gradiant, @Xarastras for example (I'd do it if everyone else is busy - I'm busier)

If you can't find one of the core PM me and I'll do a #mod-dev with you guys / guyesses

If you can't find me email me @ simon@peardox.com


  • Kexby likes this

#47
Kexby

Kexby

    (2) Evoker

  • Members
  • 72 posts
  • Location:Australia

I'm glad you liked it @Kexby

@Kilay (I think) expressed an interest in interest in expanding the Mod tutorials

 

I completely agree with him

Feel free to grab any of us in Slack

Here's @Kilay's PM to me

 

hey peardox , are you planning to make other tutorials? cuz i have in mind to make something more detailed about items (with itemmods, status effect, various attacks etc) (edited)

The answer is yep but I'm really busy on other crap

 

This appears a good learning curve for both you + @housefly to educate both yourselves and others

 

Ideally I'd like you on a shared project with an experienced member - @kilay, @tt1, @spherikal, @Ethics Gradiant, @Xarastras for example (I'd do it if everyone else is busy - I'm busier)

If you can't find one of the core PM me and I'll do a #mod-dev with you guys / guyesses

If you can't find me email me @ simon@peardox.com

 

That would be fantastic! We definitely need more tutorials.

 

I really hope Kilay gets time to expand this tutorial, cause I'd love to take my mod even further and really make it unique :).

 

Once I have more experience and know what the heck I'm doing, then writing tutorials is something I really enjoy doing (I love to teach). And I like to share what I've learned with others (it actually helps me to learn if I write it all out).

 

I just need to figure out how to use Slack (it's a bit complicated :rolleyes: ).


Edited by Kexby, 01 August 2018 - 08:53 PM.


#48
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

Don't worry @Kexby

 

We'll teach you Slack as you go - our intend is to educate and aid each other - your wishes coincide with our own

 

@Kilay is one of my best to tutor you on item-mod, statuseffects and abilities (maybe witha little @tt1)

 

If you can then write a tutorial expanding on my Sticky (First Mod) no one will be happier than myself and the gang

 

I should note that @kilay in on a flowcharting project ATM

 

This is part of a documentation library we're building

 

Everyone needs a day off

Hit us on Slack and we'll hook you up with a decent tutor

 

Do this QUICKLY as both myself and @Kilay are considering expending my sticky



#49
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer
I was recently asked about commenting mods by @tonpix and it's obvious that particularly in tutorials this is desirable
 
So here are our findings
 
If you wanna comment yur mod you HAVE to use decompressed JSON / XML - a gamedatabundle is compressed JSON which explains why this ain't reliable on that kind of file
 
If everything is on one line this WON'T work 100%
 
Most modders use 'prettified' JSON. This increases filesize a bit but makes for easy maintenance.
 
We've got some new more advanced tutorials planned by members of our team so I'm advising commenting for those
 
OK - here we go...
 
I'm using Convo Mod (final) as a testbed
 
Let's Start off with 09_cv_dawnstars_priestess.conversationbundle
 
This file is JSON so uses CStyle comments
 
Here's a modified code snippet
=============================================
{"Conversations": [
{
"ID": "b598ec6e-0c75-448d-9852-ea05530df607", 
/*
 
This is my Waenglith convo mod
 
Go read the forum post
 
*/
"Filename": "Conversations/09_Port_Maje/09_cv_Dawnstars_Priestess.conversation",
"ConversationScriptNode": { // This is another comment
"RequiresValidChildNode": false,
"NotSkippable": false,
"IsQuestionNode": false,
"HideSpeaker": false,
=============================================
 
You'll notice the /* .... */ section. This is a multi-line comment. Such sections are to explain what you're doing
 
You'll also notice a // bit. This is a single line comment (which is fine in fully formatted JSON etc but will break compressed JSON
 
The other Mod filetype is XML (DOMStyle) such as 09_cv_dawnstars_priestess.stringtable
 
Here I'm going to comment an added string...
 
 
=============================================
<!-- 
Add a question we can trigger later
-->
    <Entry>
      <ID>106</ID>
      <DefaultText>"Let me see what you have."</DefaultText>
      <FemaleText />
    </Entry>
=============================================
 
This is a different style of commenting explicit to DOM-based coding (HTML and XML being examples)
 
The <!-- .... --> is a comment in this case
 
We've tried many tests on commented code and every one passes our tests
 
These constructs allow us to explain in code what we're doing
 
I'm recommending our group comment their code whether a published mod or tutorial to help the newbie see what we're doing and why

=============================================


Edited by peardox, 02 August 2018 - 06:41 AM.

  • kilay and Kexby like this

#50
Kexby

Kexby

    (2) Evoker

  • Members
  • 72 posts
  • Location:Australia

That will be a huge help Peardox. Let's see if I've got this right.

 

// This is a single line comment

 

/*

This is a multi line comment

that uses more than one line

*/

 

You said the // single line comments could break some code types. So would it be better to just use /*  */ for all comments, single and multi?



#51
maplejar

maplejar

    (1) Prestidigitator

  • Members
  • 10 posts
  • Location:Charlotte, NC
  • Pillars of Eternity Backer
  • Kickstarter Backer
  • Deadfire Backer
  • Fig Backer

 

 

Use Notepad ++

This is really comfortable to check gamedatabundle , before you need to convert the bundle in json format with some plugin ( I use JSTool )

 

 

 

 

I highly recommend writing code in Visual Studio Code (https://code.visualstudio.com/). I didn't know jack about JSON when I first starting writing POE2 mods, and I was using notepad++ then as well. However, on one of the dev tutorials here they said they were using it so I thought I'd give it a try. It runs way faster than notepad++ does, at least for me, when loading one of the big gamedatabundle files. It "prettifies" them very quickly as well. But the big bonus for me, in learning JSON, is that it automatically underlines mistaken commas, braces, and brackets for you to show you any errors in your syntax. It's helped me out a lot.

 

You can tell Visual Studio Code that the file you're working in is JSON by clicking in the lower right, which perhaps it will initially say "plain text" and selecting JSON. You can also make it automatically associate JSON as being the language for gamedatabundle files by going to File / Preferences / Settings and entering the following in the right side column under "User Settings":

{
    "git.ignoreMissingGitWarning": true,
    "files.associations": {
        "*.gamedatabundle": "json"
    }
}

Anyway, just my two cents. I love notepad++ as well, but using Visual Studio Code helped this JSON newbie learn quicker and recognize mistakes more easily.


Edited by maplejar, 02 August 2018 - 10:08 PM.

  • BMac, kilay and Kexby like this

#52
Kexby

Kexby

    (2) Evoker

  • Members
  • 72 posts
  • Location:Australia

Thank you so much Maplejar, I'll definitely look into this. Anything that can point out my mistakes would be a real blessing :).


  • maplejar likes this

#53
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

@maplejar is in the process of joining our Slack :)

 

@kexby - in Slack go into #mod-dev to keep the flood out of #general then simply mention someone helpful (gave you some pointers in a PM) so something like...

 

@peardox trying to do an itemmod - care to help me out?

 

Replace me with ppl actually online (broken Internet ATM)

 

Actually #mod-dev is in use a lot ATM so think I'll create a #mod-dev2 and invite everyone so we've got enough space for multiple mod discussions

Hope you're getting the hang of the place @tonpix is doing some instructional stuff. Do you mind if I PM yesterday's PM to him? It describes perfectly the kinda issues new Slack members have



#54
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer
Not done one of these for a while and it's been requested that we add more content so thought today we'd give you an easy upgrade to First Mod Great Sword
 
This is an expansion of First Mod Great Sword
 
We're going to keep the last version of this item but make it more poweful
 
What we're going to do here is add something called an ItemMod to our copy of Great Sword
 
Check design/gamedata/first_mod.gamedatabundle
 
Here you'll find a section marked "Game.GameData.EquippableComponent"
 
We're going to add out ItemMod to this part
 
Slightly after than bit you'll see "ItemModsIDs": [],
 
Notice the brackets - we can add as many ItemMods to this weapon as we like.
 
Your first port of call is exported\localized\en\text\game\itemmods.stringtable - there 1,055 of them to pick from
 
Ooh - Of Fireballs sounds good
 
    <Entry>
      <ID>163</ID>
      <DefaultText>Of Fireballs</DefaultText>
      <FemaleText />
    </Entry>
 
Lets go find the ID for it
 
    {
		"$type": "Game.GameData.ItemModGameData, Assembly-CSharp",
		"DebugName": "Of_Fireballs",
		"ID": "0a8eef84-45a5-43d9-b49f-c872d5ad92dd",
		"Components": [
			{
				"$type": "Game.GameData.ItemModComponent, Assembly-CSharp",
				"DisplayName": 163,
				"HideFromUI": "false",
				"EnchantCategory": "None",
				"Cost": 2,
				"DisplayEvenIfCostZero": "false",
				"CursesItem": "false",
				"StatusEffectsOnEquipIDs": [],
				"StatusEffectsOnLaunchIDs": [],
				"StatusEffectsOnAttackIDs": [],
				"AbilityModsOnEquipIDs": [],
				"OnEquipVisualEffects": [],
				"DamageProcs": [],
				"AbilitiesOnEquipIDs": [
					"fcef4fde-8d97-40ad-9eb5-99e7e863fdb2"
				]
			}
		]
	}

 
Let's add that to our sword in our Game.GameData.EquippableComponent
 
    "ItemModsIDs": ["0a8eef84-45a5-43d9-b49f-c872d5ad92dd"],
 
Save your new version and go buy it from the FishMonger in Port Maje if you ain't already got one (it should upgrade the weapon if you've already got one)
 
We can see a load of similar enhancements if we check both files
 
Let's go crazy! These are random picks, not creating anything specific here...
 
    "ItemModsIDs": ["0a8eef84-45a5-43d9-b49f-c872d5ad92dd", 
                               "83bfd3e9-6de8-45c4-a47c-5055b1bae67b",  
                               "552de71d-6272-40c5-8fdd-dc8ac7d2fb7c"],
 
So there we have it - one powerful sword
 
gsup1.jpg
 
You MAY need to cheat yourself some cash as the thing is expensive now! 
 
We explained how to do this above but will re-iterate here
 
Type ` (a backtick)
Type iroll20s (enable cheats)
Type ` (a backtick)
Type GiveMoney 1000000 (we're now rich)
 
The use of cheats is required when developing a mod
 
You can use GiveItem fe314613-c507-4f86-86d2-dd94b09429e0 to give yourself the First Mod Great Sword for example - no need to arrach it to a vendor while developing the thing
 
This is the start of the more advanced modding stuff. Next time I'll show you how to write your own ItemMod
 
@Kilay - thought you were gonna write some of these?
 
Oops - attach the Mod (idiot)
 
 

Attached Files


Edited by peardox, 12 August 2018 - 07:25 AM.

  • kilay likes this

#55
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

Oh yeah - the legal stuff

 

Do what you want with first_mod.zip

 

PLEASE change the vendor, I use her for tutorials other than that - no real reqs

 

IF you use the same vendor I use for this thread it can cause issues with the game (it's called a race condition)

 

All information published in this thread is educational and all work on it has been freely supplied as a community effort to help new modders.

It may not look like it but this stuff is not just my work - there are many contributors - mostly translation and art in my case

 

If you check out the convo mod threads (I'll have to merge them with this now we're sticky) many people contributed to that one

 

We share

Read my Sig!



#56
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

Oh,

 

I mentioned translation above

 

I've requed translations for all strings in First Mod (French and Spanish are the only ones we can't do yet)

 

If you're a member of our Slack I've automated Google translate for us (outsiders have to do this manually)

 

/poe translate For Frodo!

 

That translates For Frodo! and comes back with...

 

{
   "de": "Für Frodo!",
   "en": "For Frodo!",
   "es": "Para Frodo!",
   "fr": "Pour Frodon!",
   "it": "Per Frodo!",
   "pl": "Dla Frodo!",
   "pt": "Para Frodo!",
   "ru": "Для Фродо!",
   "zh": "对于佛罗多!"
}
 
When you do more complex text it becomes far harder
 
"Give me a Norwegian Blue translates" badly for example - this is correctly translated in Convo Mod

I MAY do a translation tutorial mid-week (dead busy)


#57
house2fly

house2fly

    (8) Warlock

  • Members
  • 1163 posts
Remember, in the same way you copied and modified the greatsword in step 1, you can copy and modify itemmods, and the abilities and status effects attached to them. They'll need new UUIDs and new names via stringtables, but if you want to make a per-encounter version of Of Fireballs or make that freeze cone attack happen when an enemy misses you rather than when you crit, you have the power to make it happen.

(This isn't for peardox's benefit of course, but thought it might be encouraging for anyone following along)
  • peardox likes this

#58
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

That's my next major update to this one

 

Believe me, on this one - I need someone to take my workload off so if you wanna continue feel free

 

Take First Mod and add (yep I have plans)

 

1) New status effects - simply copy Fireball, give it a new ID and more life

 

2) Complete new ItemMod make this a wow - something like a summon (@kilay + @tt1 can help here)

 

That's as far as I've planned today

 

Keep it under (or around) 100 lines - 200 is bad, 25 is bad. AND yep I know I just wrote a bit on Translation that is 'bad' - do what I ask not what I do :)

 

(1) Is easy but has to be explained propelrly

(2) Is much more fun but may need breaking in two

 

KISS my friend (Keep It Simple, Stupid)

 

The people who read this don't have our support mechanism unless they hit the invite link (in my Sig)



#59
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

This one may be a little premature but gets on article off my to-do list

 

If you're a member of the team, as mentioned above, we've automated the manual process (see my Sig)

 

So - translation

 

Start here - https://translate.google.com

 

The translations are far from perfect and you need to do them all manually

 

All language codes are ISO 3166 in any chat on this subject

 

POE2 has nine languages, currently but I believe South Korean is available

 

Some of my friends have done language conversions as there are a load of missing strings

 

So...

 

Start in design/localized - it'll give you an idea of what we're trying to do here - pick a langauge you DON'T speak and at least one that you do

All we have to do is create new translations in our override and change some numbers

 

first_mod.zip is a good framework for this as although we didn't translate anything provides a sample of how we do this stuff

 

We have a good count of willing ModDevs who are very happy to translate into your own language - See my Sig!

 

Think I'm the only Brit in our gang but we have MANY members who can do other languages...

 

 



#60
peardox

peardox

    (5) Thaumaturgist

  • Members
  • 564 posts
  • Location:Manchester, UK
  • Deadfire Backer

One of our members noticed an issue with String IDs

 

I feel it important to point this out here are if you're an aspiring Modder you should be aware of the problem and a solution we came up with

 

This, AFAIK, only applies to localised/<language>/text/<somethihg.stringtable>

 

We urge you to use REALLY big numbers

We have tested this theory and it proves to be true

 

The thing is how do you chose your numbers?

 

We wrote a helper website that has a 2M : 1 chance of getting the same number range as any other developer

 

https://poe.peardox.com/spacereq

 

All future releases of First Mod will be using the above helper

 

This page gives you 1024 numbers to use that are almost guaranteed to NEVER clash with anything else

Thanks to @TT1 for finding the issue and pointing us at a workable solution


Edited by peardox, 15 August 2018 - 07:50 PM.





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users