Joined: Mon Mar 03, 2014 6:20 pm Posts: 19 Location: Japan, Ninja's den
attachment frame based on parent parts frame
hi, i'm making skin tight armor(can break) for arm & leg. therefore i must need their animation frame sync to parent parts(actuary arm & leg).
i make this code.
Code:
function Update(self) local actor = MovableMan:GetMOFromID(self.RootID); self.Frame = actor.FGLeg.Frame; end
but this code don't working...
please help me.
Tue Apr 01, 2014 5:30 am
4zK
Joined: Mon Oct 11, 2010 1:15 pm Posts: 594 Location: Finlandia
Re: attachment frame based on parent parts frame
Try this:
Code:
function Update(self) local actor = MovableMan:GetMOFromID(self.RootID); if MovableMan:IsActor(actor) then self.Frame = ToAHuman(actor).FGLeg.Frame; end end
Remember though, that if you want to use it on both legs, you could do it with the same script like this:
Code:
function Update(self) local actor = MovableMan:GetMOFromID(self.RootID); if MovableMan:IsActor(actor) then if string.find(self.PresetName,"FG") then self.Frame = ToAHuman(actor).FGLeg.Frame; else self.Frame = ToAHuman(actor).BGLeg.Frame; end end end
Last edited by 4zK on Tue Apr 01, 2014 1:11 pm, edited 1 time in total.
One minor correction, unless I'm mistaken FGLeg and BGLeg are AHuman properties, not actor properties. So you should change ToActor in 4zk's code to ToAHuman.
Tue Apr 01, 2014 7:03 am
4zK
Joined: Mon Oct 11, 2010 1:15 pm Posts: 594 Location: Finlandia
Re: attachment frame based on parent parts frame
Oh right, that's what I meant to write, sorry.
Oh, also, if you plan on using it on arms, just change actor.FGLeg to actor.FGArm, etc.
Tue Apr 01, 2014 1:11 pm
Arkblade
Joined: Mon Mar 03, 2014 6:20 pm Posts: 19 Location: Japan, Ninja's den
Re: attachment frame based on parent parts frame
thanks for tell me the code, it's work fine!
but have some questions. 1) in actor editor, this code don't seem to works.
2) arm/legs and their armor animation frame can be sync, but foot and foot and their armor animation frame can't be sync by any code?
Tue Apr 01, 2014 10:10 pm
Asklar
Data Realms Elite
Joined: Fri Jan 07, 2011 8:01 am Posts: 6211 Location: In your office, earning your salary.
Re: attachment frame based on parent parts frame
1) IIRC, Lua scripts don't work in the actor editor.
2) Feet have (at least in vanilla actors if I'm not wrong) GetsHitByMOs = 0, and Lua only check MOs with that set to 1. Not sure what would be the consequences of setting it to 1, but in case it doesn't end in random feet explosions you could iterate through the MOs of the actors and check the frame. The code would be a bit more complex than the ones on this thread.
Tue Apr 01, 2014 11:59 pm
Arkblade
Joined: Mon Mar 03, 2014 6:20 pm Posts: 19 Location: Japan, Ninja's den
Re: attachment frame based on parent parts frame
Asklar wrote:
1) IIRC, Lua scripts don't work in the actor editor.
2) Feet have (at least in vanilla actors if I'm not wrong) GetsHitByMOs = 0, and Lua only check MOs with that set to 1. Not sure what would be the consequences of setting it to 1, but in case it doesn't end in random feet explosions you could iterate through the MOs of the actors and check the frame. The code would be a bit more complex than the ones on this thread.
random feet explosions is still occur in B30?
Wed Apr 02, 2014 6:47 am
4zK
Joined: Mon Oct 11, 2010 1:15 pm Posts: 594 Location: Finlandia
Re: attachment frame based on parent parts frame
Since feet don't even receive any damage, it shouldn't really matter whether they have armor or not. Just make the base sprite of the feet look like they're armored.
Wed Apr 02, 2014 11:46 am
Arkblade
Joined: Mon Mar 03, 2014 6:20 pm Posts: 19 Location: Japan, Ninja's den
Re: attachment frame based on parent parts frame
feet their own don't receive any damage. but can't sync to other armor damage? eg: if lowerbody armor is destroy, leg and feet armor also destroy.
and i need method of searching certain parts from actor.
Thu Apr 03, 2014 1:42 am
Asklar
Data Realms Elite
Joined: Fri Jan 07, 2011 8:01 am Posts: 6211 Location: In your office, earning your salary.
Re: attachment frame based on parent parts frame
Code:
local i = 1 while i < MovableMan:GetMOIDCount() do if MovableMan:GetMOFromID(i).RootID == self.ID and i ~= self.ID then self.att = MovableMan:GetMOFromID(i) if string.find(self.att.PresetName, "PresetName of the thing you are looking for") then self.ThingIWasLookingFor = ToAttachable(self.att) end end i = i + 1 end
Not sure if the fastest way to do it, but it works. You can also add some elseif to make more variables with some specific parts you might want. Note how it says ToAttachable(self.att) in the if. Logically, you'd be looking for attachables with this script, since using it to store body parts would be redundant and would give you errors depending on the part (IIRC, arms or legs are actors or something), unless you changed it to ToActor(self.att) or whatever.
You could also be even more fancy and store everything read by that code on a table, in that way, you'd have all the MOs of the actor stored (which would also include any held devices like weapons or shields held by the actor when the script runs).
Not sure if this script would work, but modifying a bit the previous one into something like:
Code:
self.MOTable = {} local i = 1 while i < MovableMan:GetMOIDCount() do if MovableMan:GetMOFromID(i).RootID == self.ID and i ~= self.ID then self.att = MovableMan:GetMOFromID(i) self.MOTable[self.att.PresetName] = self.att end i = i + 1 end
(Thanks Bad Boy for the tables guide, never thought about using them in Cortex Command)
Using that script should store all the MOs that are part from the actor into the self.MOTable, and accesing things from there shouldn't be hard; for example, if you wanna access the lower body armor you'd use something like self.MOTable["Lower Body Armor PresetName"]. Then if you want to check if something is missing you'd only have to check if it's ID is 255, if it is, the MO doesn't exist anymore. Though it'd store redundant information like the head/arms/legs, which can already be accessed with the "self.BodyPart" thing.
Since I don't know if the script of the tables I posted there would even work at all, you should try using the first one better if you don't come up with any other method or someone else doesn't post something better. Also, I'll eventually check in if this method table I posted would work, since it looks pretty cool and smart (again, thanks Bad Boy for the tables guide).
Oh man, someone appreciated my table tutorial, thank god, I'm glad it was of some use!
Asklar, that seems solid, though I'd suggest a for loop (for i = 1, MovableMan:GetMOIDCount() do) over a while loop since the former is just more elegant for this sort of thing.
Also I vaguely recall a post (one of xenoargh's I think) mentioning that trying to do much with feet caused some very weird issues. I've been meaning to look it up and see if it's relevant to this, but keep in mind that what you're trying to do may not be doable. However, if you can find the foot position you should be able to at least fake adding attachables to it so maybe it'll be fine.
Thu Apr 03, 2014 4:33 pm
Arkblade
Joined: Mon Mar 03, 2014 6:20 pm Posts: 19 Location: Japan, Ninja's den
Re: attachment frame based on parent parts frame
thanks for tell me code.
i need write code like this?
Code:
function Update(self) self.MOTable = {} local i = 1 while i < MovableMan:GetMOIDCount() do if MovableMan:GetMOFromID(i).RootID == self.ID and i ~= self.ID then self.att = MovableMan:GetMOFromID(i) self.MOTable[self.att.MyMod LowerArmor] = self.att end i = i + 1 end
if (detection code of [self.att.MyMod LowerArmor]) then if string.find(self.MyMod LowerArmor,"FG") then self.Frame = ToAHuman(self.att).FGLeg.Frame; else self.Frame = ToAHuman(self.att).BGLeg.Frame; end break else (destroy with gib code of self) end
end
Thu Apr 03, 2014 8:44 pm
Asklar
Data Realms Elite
Joined: Fri Jan 07, 2011 8:01 am Posts: 6211 Location: In your office, earning your salary.
Re: attachment frame based on parent parts frame
Bad Boy wrote:
Oh man, someone appreciated my table tutorial, thank god, I'm glad it was of some use!
Asklar, that seems solid, though I'd suggest a for loop (for i = 1, MovableMan:GetMOIDCount() do) over a while loop since the former is just more elegant for this sort of thing.
Arkblade, kinda. First, the code to iterate through all the body parts should go on the function Create(self). Making it run on the Update one wouldn't make it crash or anything, but it would make it more laggy, specially if you have many of those actors in game.
Now, I think you mixed a bit the two scripts. If you pay attention to it, on every cycle of the while loop, you'd constantly overwrite the value of "self.MOTable[self.att.MyMod LowerArmor]" (which doesn't even seem to be a valid value ).
Let's correct it a bit;
Code:
function Create(self) self.MOTable = {} local i = 1 while i < MovableMan:GetMOIDCount() do if MovableMan:GetMOFromID(i).RootID == self.ID and i ~= self.ID then self.att = MovableMan:GetMOFromID(i) self.MOTable[self.att.PresetName] = self.att end i = i + 1 end end
That would be the first part, it would create the table with all the things you need. Now, let's suppose you named your attachables like this: "Lower Armor", "Feet Armor FG", "Feet Armor BG", "Leg Armor FG", "Leg Armor BG" (This is just a supposition, you should replace the names I put here for the real ones in your mod).
If you wanted to, say, check if your lower armor still exists, you would do something like "self.MOTable["Lower Armor"].RootID == self.ID", being true if it still exists.
Then the rest of the code would look kinda like:
Code:
function Update(self)
if self.MOTable["Leg Armor FG"].RootID == self.ID then ToAttachable(self.MOTable["Leg Armor FG"]).Frame = self.FGLeg.Frame; else ToAttachable(self.MOTable["Feet Armor FG"]):GibThis(); end
if self.MOTable["Leg Armor BG"].RootID == self.ID then ToAttachable(self.MOTable["Leg Armor BG"]).Frame = self.BGLeg.Frame; else ToAttachable(self.MOTable["Feet Armor BG"]):GibThis() end
if self.MOTable["Arm Armor FG"].RootID == self.ID then ToAttachable(self.MOTable["Arm Armor FG"]).Frame = self.FGArm.Frame; end
if self.MOTable["Arm Armor BG"].RootID == self.ID then ToAttachable(self.MOTable["Arm Armor BG"]).Frame = self.BGArm.Frame; end
end
So basically you go checking if each piece of armor exists; if it exists, you set it's frame to the respective body part's frame. In the case of leg armor, if the leg armor doesn't exist anymore, you destroy the feet armor.
The whole code would look like
Code:
function Create(self) self.MOTable = {} local i = 1 while i < MovableMan:GetMOIDCount() do if MovableMan:GetMOFromID(i).RootID == self.ID and i ~= self.ID then self.att = MovableMan:GetMOFromID(i) self.MOTable[self.att.PresetName] = self.att end i = i + 1 end end
function Update(self)
if self.MOTable["Leg Armor FG"].RootID == self.ID then ToAttachable(self.MOTable["Leg Armor FG"]).Frame = self.FGLeg.Frame; else ToAttachable(self.MOTable["Feet Armor FG"]):GibThis(); end
if self.MOTable["Leg Armor BG"].RootID == self.ID then ToAttachable(self.MOTable["Leg Armor BG"]).Frame = self.BGLeg.Frame; else ToAttachable(self.MOTable["Feet Armor BG"]):GibThis() end
if self.MOTable["Arm Armor FG"].RootID == self.ID then ToAttachable(self.MOTable["Arm Armor FG"]).Frame = self.FGArm.Frame; end
if self.MOTable["Arm Armor BG"].RootID == self.ID then ToAttachable(self.MOTable["Arm Armor BG"]).Frame = self.BGArm.Frame; end
If it doesn't work, we could always go back to the no-tables way, or maybe someone might post another good way to do it.
Fri Apr 04, 2014 1:24 am
Arkblade
Joined: Mon Mar 03, 2014 6:20 pm Posts: 19 Location: Japan, Ninja's den
Re: attachment frame based on parent parts frame
thanks for tell me the code. but i'm busy this weekend. i test the code later.
Sun Apr 06, 2014 2:01 pm
Asklar
Data Realms Elite
Joined: Fri Jan 07, 2011 8:01 am Posts: 6211 Location: In your office, earning your salary.
Re: attachment frame based on parent parts frame
No problem. Just remember to put the script on the actor itself and not on the armor like the previous scripts, and remember to change the placeholder names (like "Leg Armor FG") for the real names used in your mod.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum