Try to space out two items on the back better.

Mainly concerns scaling / hangling and it isn't perfect but better than before.
qteditor
Clonkonaut 2016-08-07 03:04:04 +02:00
parent 8d6d57089b
commit cb8086cff7
5 changed files with 137 additions and 83 deletions

View File

@ -16,29 +16,28 @@
#include Clonk_Animations
// un-comment them as soon as the new controls work with context menus etc.^
// Context menu
//#include Library_ContextMenu
// Auto production
//#include Library_AutoProduction
// ladder climbing
#include Library_CanClimbLadder
/* Initialization */
protected func Construction()
func Construction()
{
_inherited(...);
SetSkin(0);
AddEffect("IntTurn", this, 1, 1, this);
AddEffect("IntEyes", this, 1, 35+Random(4), this);
AttachBackpack();
iHandMesh = [0,0];
this.hand_display = {};
this.hand_display.hand_mesh = [0,0];
this.hand_display.hand_action = 0;
this.hand_display.both_handed = false;
this.hand_display.on_back = false;
SetSkin(0);
SetAction("Walk");
SetDir(Random(2));
// Broadcast for rules
@ -282,6 +281,19 @@ local iHandMesh;
local fHandAction;
local fBothHanded;
// Mesh attachment handling
local hand_display;
/* Features 4 properties:
hand_mesh: Array of attachment numbers for items on the clonk.
hand_action: Determines whether the clonk's hands are busy if items can be used.
one of three ints: -1, 0 or 1
-1: no items are drawn on the clonk but they are usable
0: items are drawn and can be used
+1: items are not drawn and cannot be used
both_handed: The first item held is held with both hands, so draw the second one differently.
on_back: The first item is currently on the clonk's back, so draw the second one differently (if it also goes on the back).
*/
func OnSelectionChanged(int oldslot, int newslot, bool secondaryslot)
{
AttachHandItem(secondaryslot);
@ -308,14 +320,14 @@ public func DetachObject(object obj)
func DetachHandItem(bool secondary)
{
if(iHandMesh[secondary])
if(this.hand_display.hand_mesh[secondary])
{
DetachMesh(iHandMesh[secondary]);
DetachMesh(this.hand_display.hand_mesh[secondary]);
var anim = "Close2Hand";
if (secondary) anim = "Close1Hand";
PlayAnimation(anim, CLONK_ANIM_SLOT_Hands + secondary, Anim_Const(0));
}
iHandMesh[secondary] = 0;
this.hand_display.hand_mesh[secondary] = 0;
}
func AttachHandItem(bool secondary)
@ -328,7 +340,7 @@ func UpdateAttach()
{
StopAnimation(GetRootAnimation(6));
if (iHandMesh)
if (this.hand_display.hand_mesh)
{
DetachHandItem(0);
DetachHandItem(1);
@ -338,18 +350,25 @@ func UpdateAttach()
DoUpdateAttach(1);
}
func DoUpdateAttach(bool sec)
func DoUpdateAttach(int sec)
{
var obj = GetHandItem(sec);
var other_obj = GetHandItem(!sec);
if(!obj) return;
var iAttachMode = obj->~GetCarryMode(this, sec);
if(iAttachMode == CARRY_None) return;
if(iHandMesh[sec])
var attach_mode = obj->~GetCarryMode(this, sec);
if(attach_mode == CARRY_None) return;
if(!sec)
{
DetachMesh(iHandMesh[sec]);
iHandMesh[sec] = 0;
this.hand_display.both_handed = false;
this.hand_display.on_back = false;
}
if(this.hand_display.hand_mesh[sec])
{
DetachMesh(this.hand_display.hand_mesh[sec]);
this.hand_display.hand_mesh[sec] = 0;
}
var bone = "main";
@ -357,9 +376,10 @@ func DoUpdateAttach(bool sec)
if(obj->~GetCarryBone()) bone = obj->~GetCarryBone(this, sec);
if(obj->~GetCarryBone2()) bone2 = obj->~GetCarryBone2(this, sec);
else bone2 = bone;
var nohand = 0;
if(!HasHandAction(sec, 1)) nohand = 1;
var trans = obj->~GetCarryTransform(this, sec, nohand);
var nohand = false;
if(!HasHandAction(sec, 1)) nohand = true;
var trans = obj->~GetCarryTransform(this, sec, nohand, this.hand_display.on_back);
var pos_hand = "pos_hand2";
if(sec) pos_hand = "pos_hand1";
@ -370,107 +390,125 @@ func DoUpdateAttach(bool sec)
var pos_belt = "skeleton_leg_upper.R";
if (sec) pos_belt = "skeleton_leg_upper.L";
if(!sec) fBothHanded = 0;
var special = obj->~GetCarrySpecial(this);
var special_other;
if(other_obj) special_other = other_obj->~GetCarrySpecial(this, sec);
if(special)
{
iHandMesh[sec] = AttachMesh(obj, special, bone, trans);
iAttachMode = 0;
this.hand_display.hand_mesh[sec] = AttachMesh(obj, special, bone, trans);
attach_mode = 0;
}
if(iAttachMode == CARRY_Hand)
if(attach_mode == CARRY_Hand)
{
if(HasHandAction(sec, 1))
{
iHandMesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
PlayAnimation(closehand, CLONK_ANIM_SLOT_Hands + sec, Anim_Const(GetAnimationLength(closehand)));
}
}
else if(iAttachMode == CARRY_HandBack)
else if(attach_mode == CARRY_HandBack)
{
if(HasHandAction(sec, 1))
{
iHandMesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
PlayAnimation(closehand, CLONK_ANIM_SLOT_Hands + sec, Anim_Const(GetAnimationLength(closehand)));
}
else
iHandMesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
}
else if(iAttachMode == CARRY_HandAlways)
{
iHandMesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
PlayAnimation(closehand, CLONK_ANIM_SLOT_Hands + sec, Anim_Const(GetAnimationLength(closehand)));
}
else if(iAttachMode == CARRY_Back)
{
iHandMesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
}
else if(iAttachMode == CARRY_BothHands)
{
if(sec) return;
if(HasHandAction(sec, 1) && !sec && !special_other)
{
iHandMesh[sec] = AttachMesh(obj, "pos_tool1", bone, trans);
PlayAnimation("CarryArms", CLONK_ANIM_SLOT_Hands + sec, Anim_Const(obj->~GetCarryPhase(this)));
fBothHanded = 1;
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
if (!sec)
this.hand_display.on_back = true;
}
}
else if(iAttachMode == CARRY_Spear)
else if(attach_mode == CARRY_HandAlways)
{
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
PlayAnimation(closehand, CLONK_ANIM_SLOT_Hands + sec, Anim_Const(GetAnimationLength(closehand)));
}
else if(attach_mode == CARRY_Back)
{
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
if (!sec)
this.hand_display.on_back = true;
}
else if(attach_mode == CARRY_BothHands)
{
if(sec) return;
if(HasHandAction(sec, 1) && !sec && !special_other)
{
this.hand_display.hand_mesh[sec] = AttachMesh(obj, "pos_tool1", bone, trans);
PlayAnimation("CarryArms", CLONK_ANIM_SLOT_Hands + sec, Anim_Const(obj->~GetCarryPhase(this)));
this.hand_display.both_handed = true;
}
}
else if(attach_mode == CARRY_Spear)
{
// This is a one sided animation, so switch to back if not in the main hand
if(HasHandAction(sec, 1) && !sec)
{
iHandMesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_hand, bone, trans);
PlayAnimation("CarrySpear", CLONK_ANIM_SLOT_Hands + sec, Anim_Const(0));
}
else
iHandMesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
{
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
if (!sec)
this.hand_display.on_back = true;
}
}
else if(iAttachMode == CARRY_Musket)
else if(attach_mode == CARRY_Musket)
{
if(HasHandAction(sec, 1) && !sec)
{
iHandMesh[sec] = AttachMesh(obj, "pos_hand2", bone, trans);
this.hand_display.hand_mesh[sec] = AttachMesh(obj, "pos_hand2", bone, trans);
PlayAnimation("CarryMusket", CLONK_ANIM_SLOT_Hands + sec, Anim_Const(0), Anim_Const(1000));
fBothHanded = 1;
this.hand_display.both_handed = true;
}
else
iHandMesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
{
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
if (!sec)
this.hand_display.on_back = true;
}
}
else if(iAttachMode == CARRY_Grappler)
else if(attach_mode == CARRY_Grappler)
{
if(HasHandAction(sec, 1) && !sec)
{
iHandMesh[sec] = AttachMesh(obj, "pos_hand2", bone, trans);
this.hand_display.hand_mesh[sec] = AttachMesh(obj, "pos_hand2", bone, trans);
PlayAnimation("CarryCrossbow", CLONK_ANIM_SLOT_Hands + sec, Anim_Const(0), Anim_Const(1000));
fBothHanded = 1;
this.hand_display.both_handed = true;
}
else
iHandMesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
{
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_back, bone2, trans);
if (!sec)
this.hand_display.on_back = true;
}
}
else if(iAttachMode == CARRY_Belt)
else if(attach_mode == CARRY_Belt)
{
// Do some extra transforms for this kind of carrying
if (trans)
trans = Trans_Mul(trans, Trans_Rotate(160,0,0,1), Trans_Rotate(5,0,1), Trans_Rotate(30,1), Trans_Translate(-2500,0,700), Trans_Scale(700));
else trans = Trans_Mul(Trans_Rotate(160,0,0,1), Trans_Rotate(5,0,1), Trans_Rotate(30,1), Trans_Translate(-2500,0,800), Trans_Scale(700));
iHandMesh[sec] = AttachMesh(obj, pos_belt, bone, trans);
else
trans = Trans_Mul(Trans_Rotate(160,0,0,1), Trans_Rotate(5,0,1), Trans_Rotate(30,1), Trans_Translate(-2500,0,800), Trans_Scale(700));
this.hand_display.hand_mesh[sec] = AttachMesh(obj, pos_belt, bone, trans);
}
else if(iAttachMode == CARRY_Sword)
else if(attach_mode == CARRY_Sword)
{
iHandMesh[sec] = AttachMesh(obj, "skeleton_hips", bone, trans);
this.hand_display.hand_mesh[sec] = AttachMesh(obj, "skeleton_hips", bone, trans);
}
}
public func GetHandMesh(object obj)
{
if(GetHandItem(0) == obj)
return iHandMesh[0];
return this.hand_display.hand_mesh[0];
if(GetHandItem(1) == obj)
return iHandMesh[1];
return this.hand_display.hand_mesh[1];
}
static const CARRY_None = 0;
@ -491,16 +529,17 @@ func HasHandAction(sec, just_wear, bool force_landscape_letgo)
// sec: Needs both hands (e.g. CarryHeavy?)
// just_wear: ???
// force_landscape_letgo: Also allow from actions where hands are currently grabbing the landscape (scale, hangle)
if(sec && fBothHanded)
if(sec && this.hand_display.both_handed)
return false;
if(just_wear)
{
if( HasActionProcedure(force_landscape_letgo) && !fHandAction ) // For wear purpose fHandAction==-1 also blocks
if( HasActionProcedure(force_landscape_letgo) && !this.hand_display.hand_action )
// For wear purpose this.hand_display.hand_action==-1 also blocks
return true;
}
else
{
if( HasActionProcedure(force_landscape_letgo) && (!fHandAction || fHandAction == -1) )
if( HasActionProcedure(force_landscape_letgo) && (!this.hand_display.hand_action || this.hand_display.hand_action == -1) )
return true;
}
return false;
@ -528,17 +567,17 @@ public func ReadyToAction(fNoArmCheck)
public func SetHandAction(bool fNewValue)
{
if(fNewValue > 0)
fHandAction = 1; // 1 means can't use items and doesn't draw items in hand
this.hand_display.hand_action = 1; // 1 means can't use items and doesn't draw items in hand
else if(fNewValue < 0)
fHandAction = -1; // just don't draw items in hand can still use them
this.hand_display.hand_action = -1; // just don't draw items in hand can still use them
else
fHandAction = 0;
this.hand_display.hand_action = 0;
UpdateAttach();
}
public func GetHandAction()
{
if(fHandAction == 1)
if(this.hand_display.hand_action == 1)
return true;
return false;
}

View File

@ -175,12 +175,17 @@ public func GetCarryMode(object clonk, bool idle)
return CARRY_Back;
}
public func GetCarryTransform(object clonk, bool idle, bool nohand)
public func GetCarryTransform(object clonk, bool idle, bool nohand, bool second_on_back)
{
if (idle)
return Trans_Mul(Trans_Translate(0,3000), Trans_Rotate(-45,0,1));
{
if (!second_on_back)
return Trans_Mul(Trans_Translate(0,3000, 00), Trans_Rotate(-45,0,1));
else
return Trans_Mul(Trans_Translate(-5000,3000), Trans_Rotate(-45,0,1));
}
if (nohand)
return Trans_Mul(Trans_Translate(0,-3000), Trans_Rotate(-45,0,1));
return Trans_Mul(Trans_Translate(0,-3000, -2200), Trans_Rotate(-45,0,1));
}
public func GetCarryPhase()

View File

@ -223,10 +223,15 @@ public func GetCarryMode(object clonk)
return CARRY_Musket;
}
public func GetCarryTransform(object clonk, bool idle, bool nohand)
public func GetCarryTransform(object clonk, bool idle, bool nohand, bool second_on_back)
{
if (idle)
return Trans_Mul(Trans_Rotate(180, 1), Trans_Translate(0,-3000));
{
if (!second_on_back)
return Trans_Mul(Trans_Rotate(180, 1), Trans_Translate(0,-3000));
else
return Trans_Mul(Trans_Rotate(180, 1), Trans_Translate(3000,-3000), Trans_Rotate(-30, 0, 1));
}
if (nohand)
return Trans_Mul(Trans_Rotate(180, 1), Trans_Translate(0,3000));

View File

@ -224,13 +224,18 @@ public func GetCarrySpecial()
if (is_aiming) return "pos_hand2";
}
public func GetCarryTransform(object clonk, bool idle, bool nohand)
public func GetCarryTransform(object clonk, bool idle, bool nohand, bool second_on_back)
{
if (is_aiming)
return Trans_Mul(Trans_Rotate(90,1,0,0), Trans_Rotate(-10,0,0,1));
if (idle)
return Trans_Mul(Trans_Translate(0, 3000), Trans_Rotate(180, 1));
{
if (!second_on_back)
return Trans_Mul(Trans_Translate(0, 3000), Trans_Rotate(180, 1));
else
return Trans_Mul(Trans_Translate(3000, 3000, -1500), Trans_Rotate(180, 1), Trans_Rotate(-30, 0, 1));
}
if (nohand)
return Trans_Translate(0, -3000);

View File

@ -277,7 +277,7 @@ public func GetCarryTransform(clonk, sec, back)
return nil;
}
if(back) return Trans_Mul(Trans_Mul(Trans_Rotate(90, 0, 1, 0),Trans_Rotate(180, 1, 0, 0)),Trans_Translate(0,-400,0));
if(back) return Trans_Mul(Trans_Mul(Trans_Rotate(90, 0, 1, 0),Trans_Rotate(180, 1, 0, 0)),Trans_Translate(0,-400,1000));
return Trans_Rotate(180,0,0,1);
}