Monti18 Posted September 3, 2021 Share Posted September 3, 2021 To make the weapon work like this, you would need to add something like this to the weapon prefab after ismastersim check: inst.components.weapon:SetOnAttack(function(inst,attacker) if attacker and attacker.sptnink then local val = attacker.sptnink:value() if val > 0 then --check the value of your netvar, change it to the limit you want to have attacker.sptnink:set(val-1) -- reduce the value of the netvar by 1, change it what you want else --make weapon blunt end end end) I'm not sure what you mean by using the weapon as a blunt instrument, but I think you will be able to figure this out, otherwise let me know 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 3, 2021 Author Share Posted September 3, 2021 14 hours ago, Monti18 said: To make the weapon work like this, you would need to add something like this to the weapon prefab after ismastersim check: inst.components.weapon:SetOnAttack(function(inst,attacker) if attacker and attacker.sptnink then local val = attacker.sptnink:value() if val > 0 then --check the value of your netvar, change it to the limit you want to have attacker.sptnink:set(val-1) -- reduce the value of the netvar by 1, change it what you want else --make weapon blunt end end end) I'm not sure what you mean by using the weapon as a blunt instrument, but I think you will be able to figure this out, otherwise let me know As in, they attack with the weapon itself as opposed to have the weapon fire projectiles. Pistol whiping, in a sense. Link to comment Share on other sites More sharing options...
Monti18 Posted September 4, 2021 Share Posted September 4, 2021 inst.blunt_mode = false inst.components.weapon:SetOnAttack(function(inst,attacker) if attacker and attacker.sptnink then local val = attacker.sptnink:value() if val > 0 then --check the value of your netvar, change it to the limit you want to have attacker.sptnink:set(val-1) -- reduce the value of the netvar by 1, change it what you want if inst.blunt_mode == true then inst.components.weapon:SetProjectile("your_projectile") inst.components.weapon:SetRange(your_initial_range,your_initial_range) end elseif inst.blunt_mode == false then inst.blunt_mode = true inst.components.weapon:SetProjectile(nil) inst.components.weapon:SetRange(nil,nil) end end end) I think this should work, I just added the new variable inst.blunt_mode so that the game doesn't have to reset the projectile and attackrange at each attack. 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 6, 2021 Author Share Posted September 6, 2021 (edited) Now it's saying that in sptninkbadge.lua "inst" isn't declared. self.num.current = inst.name:value() I've tried to change "name" to "sptnink" but the same error happens. But on the bright side, sptnink does drop on use! Edited September 6, 2021 by icantevenname Link to comment Share on other sites More sharing options...
Monti18 Posted September 7, 2021 Share Posted September 7, 2021 If you have a look at your badge file, you will see that you define self.owner as owner. And the owner is you, so your inst that you have. Name is also wrong, it should be sptnink, as this is as what you defined it before. self.num.current = self.owner.sptnink:value() This is how it should look. The same goes for every other line where you mention your netvar: self.percent = self.owner.sptnink:value() / self.num.max 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 7, 2021 Author Share Posted September 7, 2021 It's working, but the numbers are more than they're supposed to be. sptnink has a max of 100, starts at 10000, goes down by 200 every shot instead of 2. And since 200 is more than 100, the meter never visually depletes, so the player won't know how many more shots they have. I've done everything I could think of to fix it, but nothing's working. The only thing I could figure out was that the line "self:SetPercent(val,100)" may have something to do with it. Link to comment Share on other sites More sharing options...
icantevenname Posted September 8, 2021 Author Share Posted September 8, 2021 I've replaced "self:SetPercent(val,100)" with "self.anim:GetAnimState():SetPercent("anim", 1 - self.percent)" to see what would happen, and the meter was working well. But the numbers wouldn't show up when I hovered over the badge. Link to comment Share on other sites More sharing options...
Monti18 Posted September 8, 2021 Share Posted September 8, 2021 Oh I just saw that in fact it wants the percentage for the SetPercent function, so the OnUpdate function should look like this: function self:OnUpdate(dt) if self.owner ~= nil and self.owner.sptnink ~= nil then local percent = self.owner.sptnink:value() / self.num.max self:SetPercent(val,self.num.max) --100 is just an example, enter the max value that your badge should have. end end This should work, if it makes an error because of self.num.max replace it with 100. 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 8, 2021 Author Share Posted September 8, 2021 18 minutes ago, Monti18 said: Oh I just saw that in fact it wants the percentage for the SetPercent function, so the OnUpdate function should look like this: function self:OnUpdate(dt) if self.owner ~= nil and self.owner.sptnink ~= nil then local percent = self.owner.sptnink:value() / self.num.max self:SetPercent(val,self.num.max) --100 is just an example, enter the max value that your badge should have. end end This should work, if it makes an error because of self.num.max replace it with 100. It causes the game to hard crash to desktop. No error message or anything. I had to go into the client log to find the error... [00:00:29]: [string "scripts/mainfunctions.lua"]:1338: variable 'global_error_widget' is not declared LUA ERROR stack traceback: =[C] in function 'error' scripts/strict.lua(23,1) scripts/mainfunctions.lua(1338,1) =[C] in function 'SetPersistentString' scripts/mainfunctions.lua(26,1) in function 'SavePersistentString' scripts/modindex.lua(119,1) =[C] in function 'GetPersistentString' scripts/modindex.lua(106,1) in function 'BeginStartupSequence' scripts/main.lua(446,1) in function 'callback' scripts/modindex.lua(735,1) =[C] in function 'GetPersistentString' scripts/modindex.lua(709,1) in function 'Load' scripts/main.lua(445,1) in main chunk Link to comment Share on other sites More sharing options...
Monti18 Posted September 8, 2021 Share Posted September 8, 2021 function self:OnUpdate(dt) if self.owner ~= nil and self.owner.sptnink ~= nil then local percent = self.owner.sptnink:value() / self.num.max self:SetPercent(percent,self.num.max) --100 is just an example, enter the max value that your badge should have. end end Oh sorry I made an error, I forgot to change val to percent, this should be good now. 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 8, 2021 Author Share Posted September 8, 2021 No, still a hard crash... But I did find this in the log this time... [00:00:31]: [string "../mods/Inky/scripts/widgets/sptninkbadge.l..."]:18: variable 'self' is not declared That's the "self:OnUpdate(dt)". I'm gunna change it back to "sptninkbadge" to see what happens. Link to comment Share on other sites More sharing options...
Monti18 Posted September 8, 2021 Share Posted September 8, 2021 Oh yeah it need to have the name of the badge as long as you dont put it in the class function when you first declare it, otherwise it doesn't know what self is. Changing it should make it work. 1 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 8, 2021 Author Share Posted September 8, 2021 (edited) That worked! It took me awhile to post that cuz I tripled-checked to make sure my eyes weren't playing tricks on me. Now only one thing, the regen. I'm gunna tinker around on my own first. If I run outta ideas, I'll ask for help. If I do figure it out, I'll post what I did for you to check out. To see if it's stable or not. Thinkin' when this is said an' done, I oughtta post a quick this-is-how-its-done here so others don't have to read every little thing. Edited September 8, 2021 by icantevenname 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 8, 2021 Author Share Posted September 8, 2021 Er... I just noticed something... Reloading the save resets sptnink back to max, no matter what it was before... Link to comment Share on other sites More sharing options...
Monti18 Posted September 8, 2021 Share Posted September 8, 2021 This is because you don't save the values of sptnink. local function OnSave(inst,data) data.sptnink = inst.sptnink:value() end local function OnLoad(inst,data) if data and data.sptnink then inst.sptnink:set(data.sptnink) end end --masterpostinit inst.OnLoad = OnLoad inst.OnSave = OnSave Add this to your character prefab and it should save the values. If you already have OnLoad and OnSave functions, add the content of the functions into those. 2 Link to comment Share on other sites More sharing options...
icantevenname Posted September 8, 2021 Author Share Posted September 8, 2021 Alright, did all the tinkering I could. And I'm tapped outta ideas. All that's left is the regen. We're almost done. Link to comment Share on other sites More sharing options...
Monti18 Posted September 8, 2021 Share Posted September 8, 2021 (edited) If you just want it to regen over time, just add this to your character master postinit: inst:DoPeriodicTask(1,function(inst) if inst.sptnink then local val = inst.sptnink:value() if val < 100 then inst.sptnink:set(val + 1) -- 1 or whatever value you want it to regen over time, here 1/s end end end we check if val is smaller then 100 otherwise you will get higher values than 100. You can play with the values and see what works best for you Edited September 8, 2021 by Monti18 1 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 8, 2021 Author Share Posted September 8, 2021 Perfect! Though I had to close that last end with an ). It's all working like a charm! I'll do that last all-you-need-to-know post sometime later. I don't know about you, but over here it's everyone's-asleep-o'-clock, so I oughtta go to bed. Thanks so much! 2 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 9, 2021 Author Share Posted September 9, 2021 Okay, the this-is-how-to-do-it post. First off, you'll need to make a folder named "widgets" in the "scripts" folder. In "widgets" create a lua file and name it whatever ya want. Here, we'll call it "changethistoyourownname" so you know what to change. This down here is all you need for the badge to exist. local Badge = require "widgets/badge" -- badge template to be used local changethistoyourownname = Class(Badge, function(self, owner) Badge._ctor(self, nil, owner, { 225 / 255, 64 / 255, 0 / 255, 1 }) -- "nil" here is supposed to be the badge's art, but we couldn't figure it out. It'll use the default badge art without a icon.-- { 174 / 255, 21 / 255, 21 / 255, 1 } = colour in an rbg format self.owner = owner self.num.max = 100 --This number is the max of the character's badge self.num.current = self.num.max --Best you don't mess with this 'less ya got somethin' up your sleeve. owner:ListenForEvent("changethistoasimilarnamedirty",function(owner,data) --Yes, your custom name with "dirty" at the end. self.num.current = self.owner.changethistoasimilarname:value() self.percent = self.owner.changethistoasimilarname:value() / self.num.max end) self:StartUpdating() -- does uhhhhhgh something end) function changethistoyourownname:OnUpdate(dt) if self.owner ~= nil and self.owner.changethistoasimilarname ~= nil then local percent = self.owner.changethistoasimilarname:value() / self.num.max self:SetPercent(percent,self.num.max) --Don't touch this. FOR THE LUVVA YER DEITY OF CHOICE, DON'T TOUCH THIS! 'Less you wanna jack up yer numbers. end end return changethistoyourownname Now in your modmain, put this under your character's info. changethistoyourownname = require "widgets/changethistoyourownname" AddClassPostConstruct("widgets/statusdisplays", function(self) if self.owner.prefab ~= 'whateveryoucalledyourguy' then return end self.name = self:AddChild(changethistoyourownname(self.owner)) self.name:SetPosition(-125, 75, 0) --Best to change these all to zero and start the game to see where it is. Then change the numbers one by one to get a better idea of what each number does. end) Now to your character's lua, go to their common_postinit and add inst.changethistoasimilarname = net_ushortint(inst.GUID, "changethistoasimilarname", "changethistoasimilarnamedirty" ) --net_ushortint is the typical use of stats --"name" is the name of the netvariable --"namesdirty" is an Event which is called whenever this is changed inst.changethistoasimilarname:set(100) -- inst.name:set(number) [same as] inst.name = number inst.changethistoasimilarname:value() --getting the value of the net_variable But like this, the game won't keep track of how much of your meter is left when your save or load, resetting it to max when you load a game. So put in the following outside of any of the other tables local function OnSave(inst,data) data.changethistoasimilarname = inst.changethistoasimilarname:value() end local function OnLoad(inst,data) if data and data.changethistoasimilarname then inst.changethistoasimilarname:set(data.changethistoasimilarname) end end And at the end of the master_postinit, put inst.OnLoad = OnLoad inst.OnSave = OnSave 'Less I'm forgettin' somethin', that's it! Yer shiny new badge is all ret-2-go! It can do jus' about anythin' at this point! But that's too broad for this post, so I'm not going to cover it here. If ya ever need help, jus' ask. Not me though, I keep overestimating my programming abilities. Though I will add this, if you need to change your meter's value, it's inst.changethistoasimilarname:set(val + 1) --Be sure to change "inst" when necessary --It doesn't only have to be +. It could be -. Or *. Or /. Depends on what y'er doin'. 2 Link to comment Share on other sites More sharing options...
icantevenname Posted September 29, 2021 Author Share Posted September 29, 2021 Erm, turns out there's something up with the weapon's code. Remember the whole "blunt mode" thing? That works fine, except when blunt mode ends, the range goes back to normal, but the damage doesn't. Link to comment Share on other sites More sharing options...
Monti18 Posted September 29, 2021 Share Posted September 29, 2021 If you changed the damage the damage somewhere, you will also need to change it back to the original value when going to the blunt mode. Post the weapon prefab code if you're not able to make it work. 1 Link to comment Share on other sites More sharing options...
icantevenname Posted September 29, 2021 Author Share Posted September 29, 2021 (edited) I oughtta stop modding in the middle of the night... That's my hot modding protip: Don't program anything at 3 in the morning, even if you are a night owl. Edited September 29, 2021 by icantevenname 1 Link to comment Share on other sites More sharing options...
Monti18 Posted September 30, 2021 Share Posted September 30, 2021 Does that mean that you got it working? Link to comment Share on other sites More sharing options...
icantevenname Posted September 30, 2021 Author Share Posted September 30, 2021 Yeah. Thanks! 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now