1. Post #1
    bbbbbbb
    Aska49's Avatar
    October 2006
    948 Posts
    I haven't ever done an SNPC before, and I wanted to try my hand at a relatively simple one. The problem is, it gets completely stuck. It's using a custom model and we (my friend who did the model and I) seem to think it's the model's fault. If I tell it to use any of Valve's default models, the simple schedules I've set up for it work just fine, and it never gets stuck.

    The problem is, we've gone through countless things that we thought were the solution (both in the model and the script) and none of it has fixed the problem. Is there something wrong with my code? If it's the model's fault, does anyone know what must be done to it to fix it?

    AddCSLuaFile("cl_init.lua")
    AddCSLuaFile("shared.lua")
    
    include('shared.lua');
    
    local idle = ai_schedule.New("TestNPC Idle"); //creates the schedule used for this npc
    idle:EngTask("TASK_STOP_MOVING");
    idle:EngTask("TASK_WAIT_FOR_MOVEMENT", 0.1);
    
    local chase = ai_schedule.New("TestNPC Chase");
    chase:AddTask("FindEnemy", {Class = "player", Radius = 1000});
    chase:EngTask("TASK_FACE_ENEMY");
    chase:EngTask("TASK_GET_PATH_TO_ENEMY", 0);
    chase:EngTask("TASK_WALK_PATH");
    
    function ENT:Initialize()
    	self:SetModel("model/path/here.mdl");
    	self:SetHullType(HULL_HUMAN); 
    	self:SetHullSizeNormal(); 
    	self:SetSolid(SOLID_BBOX);
    	self:SetMoveType(MOVETYPE_STEP);
    	self:CapabilitiesAdd(CAP_MOVE_GROUND | CAP_ANIMATEDFACE | CAP_TURN_HEAD | CAP_USE_SHOT_REGULATOR | CAP_AIM_GUN)
    	self:SetMaxYawSpeed(5000);
    	self:SetHealth(100);
    	self.schd = idle;
    	self.Target = nil;
    end
    
    function ENT:SelectSchedule()
    	if (self.Target == nil) then //We gotta wait till someone gets close
    		local check = true;
    		for k, v in pairs(player.GetAll()) do
    			local dist = v:GetPos():Distance(self:GetPos()); 
    			if (dist <= 400) then
    				self.Target = v;
    				self.schd = chase;
    				check = false;
    			end
    		end
    		if (check) then
    			self:Idle()
    		end
    	else //Someone has gotten close, we know about them
    		//print("We gots target");
    		local dist = self.Target:GetPos():Distance(self:GetPos());
    		if (dist <= 1000) then
    			self.schd = chase;
    			print("CHASE");
    		else
    			print("IDLE");
    			self:Idle();
    		end
    	end
    	self:StartSchedule(self.schd);
    end
    
    function ENT:Idle()
    	if (self.Target != nil) then
    		self.Target = nil;
    	end
    	if (self.schd != idle) then
    		self.schd = idle;
    	end
    end
    
    function ENT:Think()
    	if (self.Target) then
    		self:UpdateEnemyMemory(self.Target, self.Target:GetPos());
    	end
    	self:NextThink(CurTime());
    end
    

    When I enter it's 400 range, I get plenty of "CHASE" spam, then once I exit the 1000 range it says "IDLE" once. When I reenter the range (or just stand on the model's head) it will still turn to face me and spam "CHASE", but it simply will not move. This doesn't happen with the Valve models, there's nothing I can do to get those stuck. Also, model manipulating the model into something else and back to it's original seems to fix it too, but only until you get it stuck again as explained above.

    Halp? :frown:

  2. Post #2
    Gold Member
    FluxMage's Avatar
    August 2006
    781 Posts
    Yeah, I handled the model and animations. I've been scouring around to find the problem, and I based my .QC and animation setup on the source files for other models that are currently used for fully working and fully custom SNPC's.

    At first it just couldn't move. I got the walk cycles finally working though. Animation is given a "speed" and the floor below it moves in the model viewer's "floor" as the animation plays. This allows it to move in game. Turns out, that even if it's never gonna move any direction but forward, you still need to create the other 7 directional animations as fillers even if they aren't used. I did so, works fine. But it still "breaks" depending on what you do and refuses to ever move again.

    We also considered the fact that it doesn't have turning animations. I looked into it and it appears turning animations don't need to be much more then a dummy animation named correctly (Kleiner's were like this). I fabricated some real quick but it didn't fix it.

    The Hl2 Zombie (which fully works on the above mentioned SNPC when used instead of the custom), doesn't even have turning animations as far as i can tell. I've troubleshooted numerous other possible issues with the model and patched it up to no avail.

    In case the .QC is useful to any of you chaps, here you go.

    Code:
    $cd "C:\Mod\nintendostuff\RedeadNPC"
    
    $modelname "nintendo\WWredead.mdl"
    
    $cdmaterials "models\nintendo\WWredead\"
    
    $attachment "eyes" "rd_ree_atama_1" 9.00 0.00 7.00 rotate -90 180 0
    $attachment "forward" "rd_ree_atama_1" 9.00 0.00 7.00 rotate -90 180 0
    $eyeposition  0.000 0.00 75.850
    
    $surfaceprop "flesh"
    
    $scale .38
    
    $model studio "WWredead.smd" {
    //flex "head_rightleft"
    //flex "head_updown"
    //flexcontroller head range -30 30 head_rightleft
    //flexcontroller head range -30 30 head_updown
    //%head_rightleft = head_rightleft
    //%head_updown = head_updown
    }
    
    $texturegroup skinfamilies
    {
    	{ "Redeadreedead_all" "Redeadreedead_eye"}
    	{ "Redeadreedead_all" "Redeadreedead_eye2"}
    }
    
    $jigglebone "rd_ree_earring_l1_dummy" {
    	is_flexible {
    		yaw_stiffness 250
    		yaw_damping 5
    		pitch_stiffness 300
    		pitch_damping 8
    		tip_mass 60
    		length 25
    		angle_constraint 200
    	}
    }
    
    $jigglebone "rd_ree_earring_R1_dummy" {
    	is_flexible {
    		yaw_stiffness 250
    		yaw_damping 5
    		pitch_stiffness 300
    		pitch_damping 8
    		tip_mass 60
    		length 25
    		angle_constraint 200
    	}
    }
    
    $opaque
    
    $illumposition 10 0 0 rd_ree_mune_2
    
    //Ikchains?
    //$ikchain lfoot "rd_ree_asi_l3" Z 0 height 5
    //$ikchain rfoot "rd_ree_asi_R3" Z 0 height 5
    
    $animation a_walkN "Walk_N" loop LX LY fps 60 
    
    $animation a_walk2 "Walkshriek" loop LX LY fps 60 
    
    $animation a_walkS "Walk_S" loop LX LY fps 30 
    
    $animation a_walkSE "Walk_SE" loop LX LY fps 30 
    
    $animation a_walkE "Walk_E" loop LX LY fps 30 
    
    $animation a_walkNE "Walk_NE" loop LX LY fps 30 
    
    $animation a_walkNW "Walk_NW" loop LX LY fps 30 
    
    $animation a_walkW "Walk_W" loop LX LY fps 30 
    
    $animation a_walkSW "Walk_SW" loop LX LY fps 30
    
    $sequence ragdoll "WWredeadS" loop ACT_DIERAGDOLL 1 fps 30.00
    
    $sequence attack "attack" loop ACT_ACT_MELEE_ATTACK1 1 fps 30.00
    
    $sequence idle "idle" loop ACT_IDLE 1 fps 30.00
    
    $sequence walk "a_WalkS" loop ACT_WALK 1 fps 60.00 {
    a_walkSE a_walkE a_walkNE a_walkN a_walkNW a_walkW a_walkSW a_walkS
    blendwidth 9
    blend move_yaw -180.000000 180.000000
    }
    
    $sequence walk2 "a_WalkS" loop ACT_WALK_AGITATED 1 fps 60.00 {
    a_walkSE a_walkE a_walkNE a_walk2 a_walkNW a_walkW a_walkSW a_walkS
    blendwidth 9
    blend move_yaw -180.000000 180.000000
    }
    
    $sequence right_turn "walk" ACT_TURNRIGHT45 1 fps 60.00
    
    $sequence left_turn "walk" ACT_TURNLEFT45 1 fps 60.00
    
    $sequence walk2atk "walk2atk" ACT_WALK_CROUCH 1 fps 30.00
    
    $sequence attack2walk "attack2walk" ACT_WALK_AIM 1 fps 30.00
    
    $sequence damage "damage" ACT_BIG_FLINCH 1 fps 30.00
    
    $sequence dead "dead" ACT_DIESIMPLE 1 fps 30.00
    
    $sequence standup "standup" ACT_STAND 1 fps 15.00
    
    $sequence sitdown "sitdown" ACT_CROUCH 1 fps 30.00
    
    $sequence idle2 "idle2" loop ACT_IDLE2 1 fps 30.00
    
    $sequence idleSit "idleSit" loop ACT_CROUCHIDLE 1 fps 30.00
    
    //$poseparameter neck_trans -0.15 0.17
    $poseparameter head_yaw -45.00 45.00
    $poseparameter head_pitch -19.96 22.96
    $poseparameter head_roll -10.87 10.77
    
    $collisionjoints phymodel {
    
    	$mass 45.0
    	$inertia 1.50
    	$damping 0.00
    	$rotdamping 0.00
    	$rootbone "rd_ree_kosi_1"
    
    	$jointconstrain "rd_ree_asi_r1" x limit -50.00 50.00 0.00
    	$jointconstrain "rd_ree_asi_r1" y limit -25.00 85.00 0.00
    	$jointconstrain "rd_ree_asi_r1" z limit -130.00 40.00 0.00
    
    	$jointconstrain "rd_ree_asi_r2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_r2" y limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_r2" z limit 0.00 130.00 0.00
    
    	$jointconstrain "rd_ree_asi_l1" x limit -50.00 50.00 0.00
    	$jointconstrain "rd_ree_asi_l1" y limit -85.00 25.00 0.00
    	$jointconstrain "rd_ree_asi_l1" z limit -130.00 40.00 0.00
    
    	$jointconstrain "rd_ree_asi_l2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_l2" y limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_l2" z limit 0.00 130.00 0.00
    
    	$jointconstrain "rd_ree_asi_l3" x limit -30.00 30.00 0.00
    	$jointconstrain "rd_ree_asi_l3" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_asi_l3" z limit -60.00 30.00 0.00
    
    	$jointconstrain "rd_ree_mune_1" x limit -25.00 25.00 0.00
    	$jointconstrain "rd_ree_mune_1" y limit -20.00 20.00 0.00
    	$jointconstrain "rd_ree_mune_1" z limit -50.00 15.00 0.00
    
    	$jointconstrain "rd_ree_mune_2" x limit -30.00 30.00 0.00
    	$jointconstrain "rd_ree_mune_2" y limit -20.00 20.00 0.00
    	$jointconstrain "rd_ree_mune_2" z limit -20.00 10.00 0.00
    
    	$jointconstrain "rd_ree_ude_r1" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_r1" y limit -120.00 60.00 0.00
    	$jointconstrain "rd_ree_ude_r1" z limit -90.00 110.00 0.00
    
    	$jointconstrain "rd_ree_ude_r2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_r2" y limit -160.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_r2" z limit 0.00 0.00 0.00
    
    	$jointconstrain "rd_ree_ude_l1" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_l1" y limit -60.00 120.00 0.00
    	$jointconstrain "rd_ree_ude_l1" z limit -90.00 110.00 0.00
    
    	$jointconstrain "rd_ree_ude_l2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_l2" y limit 0.00 160.00 0.00
    	$jointconstrain "rd_ree_ude_l2" z limit 0.00 0.00 0.00
    
    	$jointconstrain "rd_ree_tekubi_l1" x limit -100.00 60.00 0.00
    	$jointconstrain "rd_ree_tekubi_l1" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_tekubi_l1" z limit -70.00 40.00 0.00
    
    	$jointconstrain "rd_ree_tekubi_r1" x limit -60.00 100.00 0.00
    	$jointconstrain "rd_ree_tekubi_r1" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_tekubi_r1" z limit -70.00 40.00 0.00
    
    	$jointconstrain "rd_ree_kubi_1" x limit -50.00 50.00 0.00
    	$jointconstrain "rd_ree_kubi_1" y limit -70.00 40.00 0.00
    	$jointconstrain "rd_ree_kubi_1" z limit -40.00 40.00 0.00
    
    	$jointconstrain "rd_ree_asi_r3" x limit -30.00 30.00 0.00
    	$jointconstrain "rd_ree_asi_r3" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_asi_r3" z limit -60.00 30.00 0.00
    }
    To clear things up a bit. The SNPC will move. It follows you. Problem is soon afterward a various number of things will cause it to get stuck. In which case it recedes to its idle animation and just turns in your direction. You can get it stuck by jumping on its head or noclipping so that it can walk until it reaches your exact co-ordinates. At which point the animation spazzes out for a sec and then it recedes to its stuck idle. You can also get it stuck by getting out of range, then waiting until it stops walking around and goes idle. Sometimes going around it in circles to much gets it stuck. None of these things work 100% of the time.

    Once it's stuck, getting close to it will still try and tell it to chase. It just wont move however.

  3. Post #3
    Gold Member
    Silverlan's Avatar
    October 2005
    745 Posts
    I fixed your code up a bit. I haven't tried it, but it should work:
    AddCSLuaFile("cl_init.lua")
    AddCSLuaFile("shared.lua")
    
    include('shared.lua');
    
    local schdChase = ai_schedule.New("Chase Enemy")
    schdChase:EngTask("TASK_GET_CHASE_PATH_TO_ENEMY")
    schdChase:EngTask("TASK_RUN_PATH_TIMED", 0.2)
    
    function ENT:Initialize()
    	self:SetModel("model/path/here.mdl")
    	self:SetHullType(HULL_HUMAN); 
    	self:SetHullSizeNormal()
    	self:SetSolid(SOLID_BBOX)
    	self:SetMoveType(MOVETYPE_STEP)
    	self:CapabilitiesAdd(CAP_MOVE_GROUND | CAP_ANIMATEDFACE | CAP_TURN_HEAD | CAP_USE_SHOT_REGULATOR | CAP_AIM_GUN)
    	self:SetMaxYawSpeed(5000)
    	self:SetHealth(100)
    end
    
    function ENT:FindEnemy()
    	local plTarget
    	local flDist = 401
    	local pos = self:GetPos()
    	for k, v in ipairs(player.GetAll()) do
    		local dist = v:GetPos():Distance(pos); 
    		if (dist <= 400 && dist < flDist && v:Alive()) then
    			plTarget = v
    			flDist = dist
    		end
    	end
    	return plTarget
    end
    
    function ENT:SelectSchedule()
    	if !ValidEntity(self.Target) || self.Target:Health() <= 0 then
    		self.Target = self:FindEnemy()
    		if !ValidEntity(self.Target) then return end
    		self:SetEnemy(self.Target)
    	end
    	local dist = self.Target:GetPos():Distance(self:GetPos())
    	if (dist <= 1000) then
    		self:UpdateEnemyMemory(self.Target, self.Target:GetPos())
    		self:StartSchedule(schdChase)
    	end
    end
    
    function ENT:Think()
    end
    


    Turns out, that even if it's never gonna move any direction but forward, you still need to create the other 7 directional animations as fillers even if they aren't used. I did so, works fine. But it still "breaks" depending on what you do and refuses to ever move again.
    If it just should be able to move forward, all you need is the forward animation, and you have to add "LX" to the sequence line:
    Code:
    $sequence walk "a_walkN" LX loop ACT_WALK 1 fps 60.00
    Adding LX causes the root bone of the model to move along the X Axis, until the animation is half complete. After that it moves back to its original position.

    We also considered the fact that it doesn't have turning animations. I looked into it and it appears turning animations don't need to be much more then a dummy animation named correctly (Kleiner's were like this). I fabricated some real quick but it didn't fix it.
    The activity names for those animations are "ACT_TURN_LEFT" and "ACT_TURN_RIGHT", not "ACT_TURNLEFT"/"ACT_TURNRIGHT".

    The Hl2 Zombie (which fully works on the above mentioned SNPC when used instead of the custom), doesn't even have turning animations as far as i can tell. I've troubleshooted numerous other possible issues with the model and patched it up to no avail.
    Yeah, you don't need turning animations. The SNPC will be able to turn anyway. Turning animations just make it look nicer.

    Also stuff like "ACT_IDLE2" doesn't exist, just use ACT_IDLE instead.
    If the engine finds more than one sequence tied to an activity, it will choose a random one. The value after the activity name in the quake c file defines the chance that the sequence is played. So, for example, if you have this:
    Code:
    $sequence idle "idle" loop ACT_IDLE 10 fps 30.00
    $sequence idle2 "idle2" loop ACT_IDLE 1 fps 30.00
    then "idle" would be played ten times as often as idle2.
    If you only have one sequence tied to an activity, you should put "-1" behind the activity name.

    I also found some minor other mistakes in your qc-file. For example did you use "ACT_ACT_MELEE_ATTACK1" for the attack-sequence, and "loop" is only necessary if the sequence should really loop ingame (Like the walk, idle or run sequence). It shouldn't be used on things like attack-sequences.
    I fixed it up a bit:

    Code:
    $cd "C:\Mod\nintendostuff\RedeadNPC"
    
    $modelname "nintendo\WWredead.mdl"
    
    $cdmaterials "models\nintendo\WWredead\"
    
    $attachment "eyes" "rd_ree_atama_1" 9.00 0.00 7.00 rotate -90 180 0
    $attachment "forward" "rd_ree_atama_1" 9.00 0.00 7.00 rotate -90 180 0
    $eyeposition  0.000 0.00 75.850
    
    $surfaceprop "flesh"
    
    $scale .38
    
    $model studio "WWredead.smd" {
    //flex "head_rightleft"
    //flex "head_updown"
    //flexcontroller head range -30 30 head_rightleft
    //flexcontroller head range -30 30 head_updown
    //%head_rightleft = head_rightleft
    //%head_updown = head_updown
    }
    
    $texturegroup skinfamilies
    {
    	{ "Redeadreedead_all" "Redeadreedead_eye"}
    	{ "Redeadreedead_all" "Redeadreedead_eye2"}
    }
    
    $jigglebone "rd_ree_earring_l1_dummy" {
    	is_flexible {
    		yaw_stiffness 250
    		yaw_damping 5
    		pitch_stiffness 300
    		pitch_damping 8
    		tip_mass 60
    		length 25
    		angle_constraint 200
    	}
    }
    
    $jigglebone "rd_ree_earring_R1_dummy" {
    	is_flexible {
    		yaw_stiffness 250
    		yaw_damping 5
    		pitch_stiffness 300
    		pitch_damping 8
    		tip_mass 60
    		length 25
    		angle_constraint 200
    	}
    }
    
    $opaque
    
    $illumposition 10 0 0 rd_ree_mune_2
    
    //Ikchains?
    //$ikchain lfoot "rd_ree_asi_l3" Z 0 height 5
    //$ikchain rfoot "rd_ree_asi_R3" Z 0 height 5
    
    $sequence ragdoll "WWredeadS" ACT_DIERAGDOLL -1 fps 30.00
    $sequence attack "attack" ACT_MELEE_ATTACK1 -1 fps 30.00
    
    $sequence idle "idle" loop ACT_IDLE 1 fps 30.00
    $sequence idle2 "idle2" loop ACT_IDLE 1 fps 30.00
    
    $sequence walk "a_WalkN" LX loop ACT_WALK -1 fps 60.00
    
    // You don't need to add a sequence for every walk activity, the only you need is ACT_WALK. The others don't get called by the engine by default.
    //$sequence walk2 "a_WalkS" loop ACT_WALK_AGITATED 1 fps 60.00 {
    //a_walkSE a_walkE a_walkNE a_walk2 a_walkNW a_walkW a_walkSW a_walkS
    //blendwidth 9
    //blend move_yaw -180.000000 180.000000
    //}
    
    
    $sequence right_turn "walk" ACT_TURN_RIGHT 1 fps 60.00
    
    $sequence left_turn "walk" ACT_TURNLEFT 1 fps 60.00
    
    $sequence walk2atk "walk2atk" ACT_WALK_CROUCH -1 fps 30.00
    
    $sequence attack2walk "attack2walk" ACT_WALK_AIM -1 fps 30.00
    
    $sequence damage "damage" ACT_BIG_FLINCH -1 fps 30.00
    
    $sequence dead "dead" ACT_DIESIMPLE -1 fps 30.00
    
    $sequence standup "standup" ACT_STAND -1 fps 15.00
    
    $sequence sitdown "sitdown" ACT_CROUCH -1 fps 30.00
    
    $sequence idleSit "idleSit" loop ACT_CROUCHIDLE -1 fps 30.00
    
    //$poseparameter neck_trans -0.15 0.17
    $poseparameter head_yaw -45.00 45.00
    $poseparameter head_pitch -19.96 22.96
    $poseparameter head_roll -10.87 10.77
    
    $collisionjoints phymodel {
    
    	$mass 45.0
    	$inertia 1.50
    	$damping 0.00
    	$rotdamping 0.00
    	$rootbone "rd_ree_kosi_1"
    
    	$jointconstrain "rd_ree_asi_r1" x limit -50.00 50.00 0.00
    	$jointconstrain "rd_ree_asi_r1" y limit -25.00 85.00 0.00
    	$jointconstrain "rd_ree_asi_r1" z limit -130.00 40.00 0.00
    
    	$jointconstrain "rd_ree_asi_r2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_r2" y limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_r2" z limit 0.00 130.00 0.00
    
    	$jointconstrain "rd_ree_asi_l1" x limit -50.00 50.00 0.00
    	$jointconstrain "rd_ree_asi_l1" y limit -85.00 25.00 0.00
    	$jointconstrain "rd_ree_asi_l1" z limit -130.00 40.00 0.00
    
    	$jointconstrain "rd_ree_asi_l2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_l2" y limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_asi_l2" z limit 0.00 130.00 0.00
    
    	$jointconstrain "rd_ree_asi_l3" x limit -30.00 30.00 0.00
    	$jointconstrain "rd_ree_asi_l3" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_asi_l3" z limit -60.00 30.00 0.00
    
    	$jointconstrain "rd_ree_mune_1" x limit -25.00 25.00 0.00
    	$jointconstrain "rd_ree_mune_1" y limit -20.00 20.00 0.00
    	$jointconstrain "rd_ree_mune_1" z limit -50.00 15.00 0.00
    
    	$jointconstrain "rd_ree_mune_2" x limit -30.00 30.00 0.00
    	$jointconstrain "rd_ree_mune_2" y limit -20.00 20.00 0.00
    	$jointconstrain "rd_ree_mune_2" z limit -20.00 10.00 0.00
    
    	$jointconstrain "rd_ree_ude_r1" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_r1" y limit -120.00 60.00 0.00
    	$jointconstrain "rd_ree_ude_r1" z limit -90.00 110.00 0.00
    
    	$jointconstrain "rd_ree_ude_r2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_r2" y limit -160.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_r2" z limit 0.00 0.00 0.00
    
    	$jointconstrain "rd_ree_ude_l1" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_l1" y limit -60.00 120.00 0.00
    	$jointconstrain "rd_ree_ude_l1" z limit -90.00 110.00 0.00
    
    	$jointconstrain "rd_ree_ude_l2" x limit 0.00 0.00 0.00
    	$jointconstrain "rd_ree_ude_l2" y limit 0.00 160.00 0.00
    	$jointconstrain "rd_ree_ude_l2" z limit 0.00 0.00 0.00
    
    	$jointconstrain "rd_ree_tekubi_l1" x limit -100.00 60.00 0.00
    	$jointconstrain "rd_ree_tekubi_l1" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_tekubi_l1" z limit -70.00 40.00 0.00
    
    	$jointconstrain "rd_ree_tekubi_r1" x limit -60.00 100.00 0.00
    	$jointconstrain "rd_ree_tekubi_r1" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_tekubi_r1" z limit -70.00 40.00 0.00
    
    	$jointconstrain "rd_ree_kubi_1" x limit -50.00 50.00 0.00
    	$jointconstrain "rd_ree_kubi_1" y limit -70.00 40.00 0.00
    	$jointconstrain "rd_ree_kubi_1" z limit -40.00 40.00 0.00
    
    	$jointconstrain "rd_ree_asi_r3" x limit -30.00 30.00 0.00
    	$jointconstrain "rd_ree_asi_r3" y limit -40.00 40.00 0.00
    	$jointconstrain "rd_ree_asi_r3" z limit -60.00 30.00 0.00
    }

  4. Post #4
    Gold Member
    FluxMage's Avatar
    August 2006
    781 Posts
    Thanks big time on the model.

    1. I got the turning ACT from another QC. My mistake.

    2. The attack animation does loop. This NPC grabs you and leaches life, Thanks anyhow.

    3. They are actually 2 different walk and Idle animations used in different situations. Hence why I used ACT_WALK_AGITATED and etc. Not sure what to do with the idle.

    4. I'll try that thing for only forward. I tried it before and it didn't work. Probably my fault.

    This was my first time with this and boy I was confused, it wasn't described well on the WIKI, and other sources of information are scarce.

  5. Post #5
    bbbbbbb
    Aska49's Avatar
    October 2006
    948 Posts
    Thank you so much man, everything's working really well now.