Files
Client/GameTools/CHARACTERACTIONCONTROL/Creature.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

2967 lines
70 KiB
C++

// Creature.cpp: implementation of the CCreature class.
//
//////////////////////////////////////////////////////////////////////
#include "Creature.h"
#include "SceneManager.h"
#include "CameraControl.h"
#include "CharacterControl.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define KeyPressed( key ) HIBYTE( GetAsyncKeyState( key ) )
//extern CCharacterControl g_CharacterData;
//char CCreature::m_strWeaponMotionSheet[MAX_WEAPONTABLE][256];
//char CCreature::m_strWeapon[MAX_WEAPONTABLE][256];
CCreature::CCreature()
{
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
m_dwLowerChrAction = CA_WAIT;
m_dwUpperChrAction = CA_WAIT;
m_fRunFactor = 0.0f;
m_dwAttackCombo = 0;
m_dwSkillComboCount = 0;
m_bSkillCombo = FALSE;
m_fDeadTimer = -1.0f;
m_sDamage = 0;
m_fScale = 1.0f;
m_fChatTimer = 0.0f;
m_wMaxHP = 0;
m_sCurrHP = -1;
m_wMaxMP = 0;
m_sCurrMP = -1;
m_dwPartyID = 0;
m_dwChant = 0;
m_cSex = 1;
m_cNation = 0;
m_cLevel = 0;
m_bCharDead = FALSE;
m_bUsed = FALSE;
m_bSitMode = FALSE;
m_bFlying = FALSE;
m_bFlyFirstCheck = FALSE;
m_bStillCasting = FALSE;
m_fFixAngle=0.0f;
m_dwWeaponPos = 0;
m_bNoneComboAttackMode=TRUE;
m_bFirstPositionSend = FALSE;
m_ChrAction.m_wAniNum = 0;
m_ChrAction.m_wAniNumCount = 0;
m_bArrowExist = false;
m_Arrow.clear();
m_bSlide = false;
m_BodyEffect.clear();
m_bBodyEffect = false;
m_WeaponEffect.clear();
m_bWeaponEffect = false;
m_pWeaponLine = NULL;
m_bWeaponLine = false;
m_dwTargetId = 0xffffffff;
}
CCreature::~CCreature()
{
for( int i=0; i < m_Arrow.size(); i++ ) {
delete m_Arrow[i];
}
m_Arrow.clear();
for( i=0; i < m_BodyEffect.size(); i++ ) {
delete m_BodyEffect[i];
}
m_BodyEffect.clear();
for( i=0; i < m_WeaponEffect.size(); i++ ) {
delete m_WeaponEffect[i];
}
m_WeaponEffect.clear();
if(m_pWeaponLine != NULL)
{
delete m_pWeaponLine;
m_pWeaponLine = NULL;
}
}
BOOL CCreature::SetAction(unsigned long dwUpperAni, unsigned long dwLowerAni)
{
char strUpperAction[MAX_PATH], strLowerAction[MAX_PATH];
BOOL bAction = FALSE;
if(m_lpChrModel)
{
SetMotionString(dwUpperAni, strUpperAction);
SetMotionString(dwLowerAni, strLowerAction);
if(m_dwUpperChrAction != dwUpperAni)
{
if(IsCancelAction(1))
{
m_dwUpperChrAction = dwUpperAni;
m_bUpperAnimating = FALSE;
}
}
if(m_dwLowerChrAction != dwLowerAni)
{
if(IsCancelAction(2))
{
m_dwLowerChrAction = dwLowerAni;
m_bLowerAnimating = FALSE;
}
}
/* if(m_lpChrModel->IsActionFinished(0)) { m_dwUpperChrAction = dwUpperAni; m_bUpperAble = TRUE; }
if(m_lpChrModel->IsActionFinished(1)) { m_dwLowerChrAction = dwLowerAni; m_bLowerAble = TRUE; }
*/
if( ((m_dwUpperChrAction == CA_TURNPUNCH1 || m_dwUpperChrAction == CA_TURNPUNCH2 || m_dwUpperChrAction == CA_AIMEDSHOT1 || m_dwUpperChrAction == CA_AIMEDSHOT2 || m_dwUpperChrAction == CA_CASTING || m_dwUpperChrAction == CA_REST || m_dwUpperChrAction == CA_WAIT) && !m_bUpperAnimating) &&
((m_dwLowerChrAction == CA_TURNPUNCH1 || m_dwLowerChrAction == CA_TURNPUNCH2 || m_dwLowerChrAction == CA_AIMEDSHOT1 || m_dwLowerChrAction == CA_AIMEDSHOT2 || m_dwLowerChrAction == CA_CASTING || m_dwLowerChrAction == CA_REST || m_dwLowerChrAction == CA_WAIT) && !m_bLowerAnimating))
{
m_dwUpperChrAction = dwUpperAni;
m_dwLowerChrAction = dwLowerAni;
m_lpChrModel->SetMotion(strUpperAction, 3);
m_bUpperAnimating = TRUE;
m_bLowerAnimating = TRUE;
if(IsCancelAction(1)) m_bUpperAble = TRUE; else m_bUpperAble = FALSE;
if(IsCancelAction(2)) m_bLowerAble = TRUE; else m_bLowerAble = FALSE;
return TRUE;
}
if(!m_bUpperAnimating)
{
m_dwUpperChrAction = dwUpperAni;
m_lpChrModel->SetMotion(strUpperAction, 1);
m_bUpperAnimating = TRUE;
bAction = TRUE;
if(IsCancelAction(1)) m_bUpperAble = TRUE; else m_bUpperAble = FALSE;
// if(!m_bLowerAble) m_lpChrModel->SetMotionCurrentFrame(1, m_lpChrModel->GetMotionCurrentFrame(2));
}
if(!m_bLowerAnimating)
{
m_dwLowerChrAction = dwLowerAni;
m_lpChrModel->SetMotion(strLowerAction, 2);
m_bLowerAnimating = TRUE;
bAction = TRUE;
if(IsCancelAction(2)) m_bLowerAble = TRUE; else m_bLowerAble = FALSE;
// if(!m_bUpperAble) m_lpChrModel->SetMotionCurrentFrame(2, m_lpChrModel->GetMotionCurrentFrame(1));
}
} else
{
m_dwUpperChrAction = dwUpperAni;
m_dwLowerChrAction = dwLowerAni;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
}
return bAction;
}
BOOL CCreature::SetAction(char *strUpperAction, char *strLowerAction)
{
unsigned long dwUpperAni, dwLowerAni;
BOOL bAction = FALSE;
SetMotionString(&dwUpperAni, strUpperAction);
SetMotionString(&dwLowerAni, strLowerAction);
if(m_lpChrModel)
{
if(m_dwUpperChrAction != dwUpperAni)
{
if(IsCancelAction(1))
{
m_dwUpperChrAction = dwUpperAni;
m_bUpperAnimating = FALSE;
if(IsCancelAction(1)) m_bUpperAble = TRUE; else m_bUpperAble = FALSE;
}
}
if(m_dwLowerChrAction != dwLowerAni)
{
if(IsCancelAction(2))
{
m_dwLowerChrAction = dwLowerAni;
m_bLowerAnimating = FALSE;
if(IsCancelAction(2)) m_bLowerAble = TRUE; else m_bLowerAble = FALSE;
}
}
if( ((m_dwUpperChrAction == CA_TURNPUNCH1 || m_dwUpperChrAction == CA_TURNPUNCH2 || m_dwUpperChrAction == CA_AIMEDSHOT1 || m_dwUpperChrAction == CA_AIMEDSHOT2 || m_dwUpperChrAction == CA_CASTING || m_dwUpperChrAction == CA_REST || m_dwUpperChrAction == CA_WAIT) && !m_bUpperAnimating) &&
((m_dwLowerChrAction == CA_TURNPUNCH1 || m_dwLowerChrAction == CA_TURNPUNCH2 || m_dwLowerChrAction == CA_AIMEDSHOT1 || m_dwLowerChrAction == CA_AIMEDSHOT2 || m_dwLowerChrAction == CA_CASTING || m_dwLowerChrAction == CA_REST || m_dwLowerChrAction == CA_WAIT) && !m_bLowerAnimating))
{
m_lpChrModel->SetMotion(strUpperAction, 3);
m_dwUpperChrAction = dwUpperAni;
m_dwLowerChrAction = dwLowerAni;
m_bUpperAnimating = TRUE;
m_bLowerAnimating = TRUE;
return TRUE;
}
if(!m_bUpperAnimating)
{
m_lpChrModel->SetMotion(strUpperAction, 1);
m_dwUpperChrAction = dwUpperAni;
m_bUpperAnimating = TRUE;
bAction = TRUE;
// if(!m_bLowerAble) m_lpChrModel->SetMotionCurrentFrame(1, m_lpChrModel->GetMotionCurrentFrame(2));
}
if(!m_bLowerAnimating)
{
m_lpChrModel->SetMotion(strLowerAction, 2);
m_dwLowerChrAction = dwLowerAni;
m_bLowerAnimating = TRUE;
bAction = TRUE;
// if(!m_bUpperAble) m_lpChrModel->SetMotionCurrentFrame(2, m_lpChrModel->GetMotionCurrentFrame(1));
}
} else
{
m_dwUpperChrAction = dwUpperAni;
m_dwLowerChrAction = dwLowerAni;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
}
return bAction;
}
void CCreature::SetMotionString(unsigned long dwAction, char *strAction)
{
/// 여기서 무기에 따라 시트를 틀리게 한다.
CollisionType CT = CSceneManager::GetCharacterCollisionType(m_lpChrModel);
if(CT == CT_WATER)
{
strcpy(strAction, "SWIM");
if(m_lpChrModel)
m_lpChrModel->SetFixHeight(true);
//m_lpChrModel->m_fFixHeight = 0.0f;
return;
}
else
{
m_lpChrModel->SetFixHeight(false);
//m_lpChrModel->m_fFixHeight = 0.0f;
}
switch(dwAction)
{
case CA_WAIT:
strcpy(strAction, "WAIT");
break;
case CA_WALK:
strcpy(strAction, "WALK");
break;
case CA_WALKRIGHT:
strcpy(strAction, "WALK_RIGHT");
break;
case CA_WALKLEFT:
strcpy(strAction, "WALK_LEFT");
break;
case CA_WALKBACK:
strcpy(strAction, "WALK_BACK");
break;
case CA_RUN:
strcpy(strAction, "RUN");
break;
case CA_REST:
strcpy(strAction, "REST");
break;
case CA_SITDOWN:
strcpy(strAction, "SIT_DOWN");
break;
case CA_STANDUP:
strcpy(strAction, "STAND_UP");
break;
case CA_ATTACK:
strcpy(strAction, "ATTACK");
break;
case CA_ATTACKADVANCE:
strcpy(strAction, "ATTACK_ADVANCE");
break;
case CA_ATTACKLEFT:
strcpy(strAction, "ATTACK_LEFT");
break;
case CA_ATTACKRIGHT:
strcpy(strAction, "ATTACK_RIGHT");
break;
case CA_ATTACKRETREAT:
strcpy(strAction, "ATTACK_RETREAT");
break;
case CA_ATTACK2:
strcpy(strAction, "ATTACK2");
break;
case CA_ATTACK3:
strcpy(strAction, "ATTACK3");
break;
case CA_ATTACK4:
strcpy(strAction, "ATTACK4");
break;
case CA_ATTACK5:
strcpy(strAction, "ATTACK5");
break;
case CA_ATTACK6:
strcpy(strAction, "ATTACK6");
break;
case CA_FALLDOWN:
strcpy(strAction, "FALLDOWN");
break;
case CA_BASH:
strcpy(strAction, "BASH");
break;
case CA_COMBINATIONBLOW:
strcpy(strAction, "COMBINATION_BLOW");
break;
case CA_BACKSTAB:
strcpy(strAction, "BACKSTAB");
break;
case CA_FIRE1:
strcpy(strAction, "FIRE1");
break;
case CA_FIRE2:
strcpy(strAction, "FIRE2");
break;
case CA_SHOT:
strcpy(strAction, "SHOT");
break;
case CA_JUMPSHOT:
strcpy(strAction, "JUMP_SHOT");
break;
case CA_JUMP:
strcpy(strAction, "JUMP");
break;
case CA_FORWARDJUMP:
strcpy(strAction, "JUMP");
break;
case CA_BACKJUMP:
strcpy(strAction, "JUMP");
break;
case CA_FRONTDASH:
strcpy(strAction, "DODGE_FRONT");
break;
case CA_LEFTDASH:
strcpy(strAction, "DODGE_LEFT");
break;
case CA_RIGHTDASH:
strcpy(strAction, "DODGE_RIGHT");
break;
case CA_AIMEDSHOT1:
strcpy(strAction, "AIMED_SHOT1");
break;
case CA_AIMEDSHOT2:
strcpy(strAction, "AIMED_SHOT2");
break;
case CA_AIMEDSHOT3:
strcpy(strAction, "AIMED_SHOT3");
break;
case CA_SWIM:
strcpy(strAction, "SWIM");
break;
case CA_CASTING:
strcpy(strAction, "CASTING");
break;
case CA_BACKDASH:
strcpy(strAction, "DODGE_BACK");
break;
case CA_JUMPATTACK:
strcpy(strAction, "JUMP_ATTACK");
break;
case CA_JUMPATTACK2:
strcpy(strAction, "JUMP_ATTACK2");
break;
case CA_LAND:
strcpy(strAction, "LAND");
break;
case CA_OVERBASH1:
strcpy(strAction, "OVER_BASH1");
break;
case CA_OVERBASH2:
strcpy(strAction, "OVER_BASH2");
break;
case CA_OVERBASH3:
strcpy(strAction, "OVER_BASH3");
break;
case CA_OVERBASH4:
strcpy(strAction, "OVER_BASH4");
break;
case CA_OVERBASH5:
strcpy(strAction, "OVER_BASH5");
break;
case CA_POWERDRAIN:
strcpy(strAction, "POWER_DRAIN");
break;
case CA_TURNPUNCH1:
strcpy(strAction, "TURN_PUNCH1");
break;
case CA_TURNPUNCH2:
strcpy(strAction, "TURN_PUNCH2");
break;
case CA_TURNPUNCH3:
strcpy(strAction, "TURN_PUNCH3");
break;
case CA_JUMPATTACK3:
strcpy(strAction, "JUMP_ATTACK3");
break;
case CA_STUN:
strcpy(strAction, "STUN");
break;
case CA_ROUNDSWING:
strcpy(strAction, "ROUND_SWING");
break;
}
}
void CCreature::SetMotionString(unsigned long *dwAction, char *strAction)
{
// unsigned long dwWeapon = CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos]);
if(!strcmp(strAction, "BASH"))
{
*dwAction = CA_BASH;
} else if(!strcmp(strAction, "FIRE1"))
{
*dwAction = CA_FIRE1;
} else if(!strcmp(strAction, "FIRE2"))
{
*dwAction = CA_FIRE2;
} else if(!strcmp(strAction, "COMBINATION_BLOW"))
{
*dwAction = CA_COMBINATIONBLOW;
} else if(!strcmp(strAction, "BACKSTAB"))
{
*dwAction = CA_BACKSTAB;
} else if(!strcmp(strAction, "AIMED_SHOT1"))
{
*dwAction = CA_AIMEDSHOT1;
} else if(!strcmp(strAction, "AIMED_SHOT2"))
{
*dwAction = CA_AIMEDSHOT2;
} else if(!strcmp(strAction, "AIMED_SHOT3"))
{
*dwAction = CA_AIMEDSHOT3;
} else if(!strcmp(strAction, "CASTING"))
{
*dwAction = CA_CASTING;
} else if(!strcmp(strAction, "JUMP_ATTACK"))
{
*dwAction = CA_JUMPATTACK;
} else if(!strcmp(strAction, "JUMP_ATTACK2"))
{
*dwAction = CA_JUMPATTACK2;
} else if(!strcmp(strAction, "SHOT"))
{
*dwAction = CA_SHOT;
} else if(!strcmp(strAction, "JUMP_SHOT"))
{
*dwAction = CA_JUMPSHOT;
} else if(!strcmp(strAction, "OVER_BASH1"))
{
*dwAction = CA_OVERBASH1;
} else if(!strcmp(strAction, "OVER_BASH2"))
{
*dwAction = CA_OVERBASH2;
} else if(!strcmp(strAction, "OVER_BASH3"))
{
*dwAction = CA_OVERBASH3;
} else if(!strcmp(strAction, "OVER_BASH4"))
{
*dwAction = CA_OVERBASH4;
} else if(!strcmp(strAction, "OVER_BASH5"))
{
*dwAction = CA_OVERBASH5;
} else if(!strcmp(strAction, "POWER_DRAIN"))
{
*dwAction = CA_POWERDRAIN;
} else if(!strcmp(strAction, "TURN_PUNCH1"))
{
*dwAction = CA_TURNPUNCH1;
} else if(!strcmp(strAction, "TURN_PUNCH2"))
{
*dwAction = CA_TURNPUNCH2;
} else if(!strcmp(strAction, "TURN_PUNCH3"))
{
*dwAction = CA_TURNPUNCH3;
} else if(!strcmp(strAction, "JUMP_ATTACL3"))
{
*dwAction = CA_JUMPATTACK3;
} else if(!strcmp(strAction, "STUN"))
{
*dwAction = CA_STUN;
} else if(!strcmp(strAction, "ROUND_SWING"))
{
*dwAction = CA_ROUNDSWING;
}
}
BOOL CCreature::IsCancelAction(unsigned long dwPart)
{
switch(dwPart)
{
case 1:
if( m_dwUpperChrAction == CA_RUN || m_dwUpperChrAction == CA_WALK ||
m_dwUpperChrAction == CA_WALKLEFT || m_dwUpperChrAction == CA_WALKRIGHT ||
m_dwUpperChrAction == CA_WALKBACK || m_dwUpperChrAction == CA_WAIT ||
m_dwUpperChrAction == CA_REST)/* || m_dwUpperChrAction == CA_LEFTDASH ||
m_dwUpperChrAction == CA_RIGHTDASH)/**/
return TRUE;
break;
case 2:
if( m_dwLowerChrAction == CA_RUN || m_dwLowerChrAction == CA_WALK ||
m_dwLowerChrAction == CA_WALKLEFT || m_dwLowerChrAction == CA_WALKRIGHT ||
m_dwLowerChrAction == CA_WALKBACK || m_dwLowerChrAction == CA_WAIT ||
m_dwLowerChrAction == CA_REST)
return TRUE;
break;
case 3:
if((m_dwUpperChrAction == CA_RUN || m_dwUpperChrAction == CA_WALK ||
m_dwUpperChrAction == CA_WALKLEFT || m_dwUpperChrAction == CA_WALKRIGHT ||
m_dwUpperChrAction == CA_WALKBACK || m_dwUpperChrAction == CA_WAIT ||
m_dwUpperChrAction == CA_REST) &&
(m_dwLowerChrAction == CA_RUN || m_dwLowerChrAction == CA_WALK ||
m_dwLowerChrAction == CA_WALKLEFT || m_dwLowerChrAction == CA_WALKRIGHT ||
m_dwLowerChrAction == CA_WALKBACK || m_dwLowerChrAction == CA_WAIT ||
m_dwLowerChrAction == CA_REST))
return TRUE;
break;
}
return FALSE;
}
void CCreature::InitChrAction()
{
/* if(m_bStillCasting && m_lpChrModel->IsActionFinished(0) && m_lpChrModel->IsActionFinished(1) && !m_bCharDead)
{
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
m_dwUpperChrAction = CA_CASTING;
m_dwLowerChrAction = CA_CASTING;
SetAction(m_dwUpperChrAction, m_dwLowerChrAction);
return;
}*/
if(m_bCharDead)
{
m_dwUpperChrAction = CA_FALLDOWN;
m_dwLowerChrAction = CA_FALLDOWN;
}
if(m_lpChrModel->IsActionFinished(0) && !m_bCharDead)
{
if(GetChantFlag(26))
{
m_dwUpperChrAction = CA_STUN;
} else
{
if(m_dwUpperChrAction == CA_SWIM)
{
m_dwUpperChrAction = CA_SWIM;
} else if(m_bSitMode)
{
m_dwUpperChrAction = CA_REST;
} else if(!m_bStillCasting)
{
m_dwUpperChrAction = CA_WAIT;
}
}
m_bUpperAble = TRUE;
m_bUpperAnimating = FALSE;
if(m_lpChrModel)
{
if(GetChantFlag(27))
{
m_lpChrModel->SetAnimationSpeed(0.5f);
} else
{
m_lpChrModel->SetAnimationSpeed(1.0f);
}
}
}
if(m_lpChrModel->IsActionFinished(1))
{
if(m_dwLowerChrAction == CA_FIRE1 || m_dwLowerChrAction == CA_FIRE2 || m_dwLowerChrAction == CA_SHOT || m_dwLowerChrAction == CA_JUMPSHOT)
{
InitWeapon(1);
}
if(m_bCharDead)
{
m_bLowerAnimating = FALSE;
} else
{
if(m_dwLowerChrAction==CA_LEFTDASH || m_dwLowerChrAction==CA_RIGHTDASH || m_dwLowerChrAction == CA_BACKDASH)
{
CSceneManager::CharacterFirstAccelate(m_lpChrModel,false);
CSceneManager::AddDelayTimer(m_lpChrModel,30);
}
if(GetChantFlag(26))
{
m_dwUpperChrAction = CA_STUN;
} else
{
if(m_dwLowerChrAction == CA_SWIM)
{
m_dwLowerChrAction = CA_SWIM;
} else if(m_bSitMode)
{
m_dwLowerChrAction = CA_REST;
} else if(m_dwLowerChrAction != CA_FORWARDJUMP && m_dwLowerChrAction != CA_BACKJUMP &&
m_dwLowerChrAction != CA_JUMP && m_dwLowerChrAction != CA_FRONTDASH && !m_bStillCasting)
{
m_dwLowerChrAction = CA_WAIT;
}
}
m_bLowerAble = TRUE;
m_bLowerAnimating = FALSE;
}
}
}
void CCreature::Run(float fRunFactor)
{
if(m_bLowerAble)
{
if(m_bSitMode) { CrouchAndStandup(); return; }
/*
if(m_dwUpperChrAction == CA_ATTACK || m_dwUpperChrAction == CA_ATTACKADVANCE)
{
m_fRunFactor = 0.0f;
if(!m_lpChrModel->IsActionFinished(0))
{
SetAction(m_dwUpperChrAction, CA_WALK);
return;
}
}
*/
if(m_fRunFactor < 155.0f) m_fRunFactor += fRunFactor;
SetAction(CA_RUN, CA_RUN);
}
}
void CCreature::WalkLeft()
{
if(m_bLowerAble)
{
m_fRunFactor = 0.0f;
if(m_bSitMode) { CrouchAndStandup(); return; }
SetAction(CA_WALKLEFT, CA_WALKLEFT);
}
}
void CCreature::WalkRight()
{
if(m_bLowerAble)
{
m_fRunFactor = 0.0f;
if(m_bSitMode) { CrouchAndStandup(); return; }
SetAction(CA_WALKRIGHT, CA_WALKRIGHT);
}
}
void CCreature::WalkBack()
{
if(m_bLowerAble)
{
m_fRunFactor = 0.0f;
if(m_bSitMode) { CrouchAndStandup(); return; }
SetAction(CA_WALKBACK, CA_WALKBACK);
}
}
void CCreature::CrouchAndStandup(void)
{
if(m_bUpperAble && m_bLowerAble && m_lpChrModel)
{
m_fRunFactor = 0.0f;
if(GetChantFlag(27))
{
m_lpChrModel->SetAnimationSpeed(0.5f);
} else
{
m_lpChrModel->SetAnimationSpeed(1.0f);
}
CSceneManager::CharacterMovementVector(m_lpChrModel, vector3(0.0f, 0.0f, 0.0f));
if(m_bSitMode)
{
InitWeapon(0);
SetAction(CA_STANDUP, CA_STANDUP);
m_bSitMode = FALSE;
} else
{
InitWeapon(0);
SetAction(CA_SITDOWN, CA_SITDOWN);
m_bSitMode = TRUE;
}
}
}
void CCreature::Wait()
{
if(m_bUpperAble || m_bLowerAble)
{
m_fRunFactor = 0.0f;
if(GetChantFlag(26))
{
SetAction(CA_STUN, CA_STUN);
} else
{
if(m_bSitMode)
{
/* if(m_dwUpperChrAction != CA_REST || m_dwLowerChrAction != CA_REST)
{
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
}*/
SetAction(CA_REST, CA_REST);
} else
{
/* if(m_dwUpperChrAction != CA_WAIT || m_dwLowerChrAction != CA_WAIT)
{
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
}*/
SetAction(CA_WAIT, CA_WAIT);
}
}
}
}
void CCreature::Dead()
{
// if(m_dwLowerChrAction != CA_FALLDOWN && m_dwUpperChrAction != CA_FALLDOWN)
if(!m_bCharDead)
{
m_fRunFactor = 0.0f;
m_dwAttackCombo = 0;
m_dwSkillComboCount = 0;
m_bSkillCombo = FALSE;
/*
if(g_CharacterData.m_lpButtonNormal)
{
CSceneManager::m_EffectManager.DeleteInterfaceScript(g_CharacterData.m_lpButtonNormal);
g_CharacterData.m_lpButtonNormal = NULL;
g_CharacterData.m_bComboSuccess = FALSE;
}
*/
m_bSitMode = FALSE;
m_fDeadTimer = 1.0f;
m_bCharDead = TRUE;
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
if(m_lpChrModel)
{
m_lpChrModel->SetAnimationSpeed(1.0f);
InitWeapon(0);
CSceneManager::CharacterMovementVector(m_lpChrModel, vector3(0.0f, 0.0f, 0.0f));
CSceneManager::CharacterFirstAccelate(m_lpChrModel, false);
SetAction(CA_FALLDOWN, CA_FALLDOWN);
} else
{
SetAction(CA_FALLDOWN, CA_FALLDOWN);
}
}
}
BOOL CCreature::Attack(unsigned long dwUpperAni, unsigned long dwLowerAni)
{
if(m_bFlying)
{
// InitWeapon(1);
if((m_dwLowerChrAction != CA_JUMPATTACK && m_dwLowerChrAction != CA_JUMPATTACK2) && m_bFlyFirstCheck)
{
if(m_wClass == 6 || m_wClass == 2 || m_wClass == 7 || m_wClass == 20 || m_wClass == 24) // 점프 공격
{
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
if(KeyPressed('S') && (m_wClass == 2 || m_wClass == 7 || m_wClass == 20)) // 내려 찍기
{
SetAction(CA_JUMPATTACK2, CA_JUMPATTACK2);
} else
{
SetAction(CA_JUMPATTACK, CA_JUMPATTACK);
}
return TRUE;
}
}
}
if(m_bUpperAble)
{
// InitWeapon(1);
m_fRunFactor = 0.0f;
if(m_bSitMode) { CrouchAndStandup(); return TRUE; }
unsigned long dwUpperAni2, dwLowerAni2;
if(dwUpperAni == 0xFFFFFFFF && dwLowerAni == 0xFFFFFFFF)
{
switch(m_dwLowerChrAction)
{
case CA_WALK:
case CA_RUN:
dwUpperAni2 = CA_ATTACKADVANCE;
dwLowerAni2 = m_dwLowerChrAction;
break;
case CA_WALKLEFT:
dwUpperAni2 = CA_ATTACKLEFT;
dwLowerAni2 = m_dwLowerChrAction;
break;
case CA_WALKRIGHT:
dwUpperAni2 = CA_ATTACKRIGHT;
dwLowerAni2 = m_dwLowerChrAction;
break;
case CA_WALKBACK:
dwUpperAni2 = CA_ATTACKRETREAT;
dwLowerAni2 = m_dwLowerChrAction;
break;
case CA_LEFTDASH:
if(m_wClass == 1 || m_wClass == 5 || m_wClass == 6 || m_wClass == 19 || m_wClass == 20) // 대쉬 공격
{
if(m_dwUpperChrAction == CA_LEFTDASH) m_dwUpperChrAction = CA_WAIT;
dwUpperAni2 = CA_ATTACKLEFT;
dwLowerAni2 = m_dwLowerChrAction;
} else
{
return FALSE;
}
break;
case CA_RIGHTDASH:
if(m_wClass == 1 || m_wClass == 5 || m_wClass == 6 || m_wClass == 19 || m_wClass == 20) // 대쉬 공격
{
if(m_dwUpperChrAction == CA_RIGHTDASH) m_dwUpperChrAction = CA_WAIT;
dwUpperAni2 = CA_ATTACKRIGHT;
dwLowerAni2 = m_dwLowerChrAction;
} else
{
return FALSE;
}
break;
default:
switch(m_dwAttackCombo)
{
case 0:
dwUpperAni2 = CA_ATTACK;
dwLowerAni2 = CA_ATTACK;
break;
case 1:
dwUpperAni2 = CA_ATTACK2;
dwLowerAni2 = CA_ATTACK2;
break;
case 2:
dwUpperAni2 = CA_ATTACK3;
dwLowerAni2 = CA_ATTACK3;
break;
case 3:
dwUpperAni2 = CA_ATTACK4;
dwLowerAni2 = CA_ATTACK4;
break;
case 4:
dwUpperAni2 = CA_ATTACK5;
dwLowerAni2 = CA_ATTACK5;
break;
case 5:
dwUpperAni2 = CA_ATTACK6;
dwLowerAni2 = CA_ATTACK6;
break;
}
break;
}
} else
{
dwUpperAni2 = dwUpperAni;
dwLowerAni2 = dwLowerAni;
}
if(SetAction(dwUpperAni2, dwLowerAni2))
{
if(m_strShape[11 + m_dwWeaponPos])
{
if(m_lpChrModel)
{
if(GetChantFlag(27))
{
m_lpChrModel->SetAnimationSpeed(0.55f); // 0.55
} else
{
m_lpChrModel->SetAnimationSpeed(1.10f); // 1.10
}
}
/*
switch(CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos]))
{
case 6:
case 7:
case 8:
if(m_lpChrModel && (m_wClass == 4 || m_wClass == 11 || m_wClass == 12 || m_wClass == 3 || m_wClass == 9 || m_wClass == 10)) // 공속 느려지게 하기
{
if(GetChantFlag(27))
{
m_lpChrModel->SetAnimationSpeed(0.5f); // 0.5
} else
{
m_lpChrModel->SetAnimationSpeed(1.0f); // 1.0
}
}
break;
case 9:
case 10:
case 11:
if(m_lpChrModel && (m_wClass == 2 || m_wClass == 7 || m_wClass == 8 || m_wClass == 4 || m_wClass == 11 || m_wClass == 12 || m_wClass == 3 || m_wClass == 9 || m_wClass == 10)) // 공속 느려지게 하기
{
if(GetChantFlag(27))
{
m_lpChrModel->SetAnimationSpeed(0.475f); // 0.475
} else
{
m_lpChrModel->SetAnimationSpeed(0.95f); // 0.95
}
}
break;
}
*/
}
return TRUE;
}
}
return FALSE;
}
void CCreature::Respawn()
{
m_fRunFactor = 0.0f;
m_bSitMode = FALSE;
m_sDamage = 0;
m_bCharDead = FALSE;
for( int i=0; i < m_Arrow.size(); i++ ) {
delete m_Arrow[i];
}
m_Arrow.clear();
if(m_lpChrModel)
{
InitWeapon(0);
m_lpChrModel->SetAnimationSpeed(1.0f);
}
for(i = 0; i < m_lstActionData.num;)
{
m_lstActionData.DelIndex(0);
}
m_lstActionData.num = 0;
for(i = 0; i < m_lstDamageNumber.num;)
{
m_lstDamageNumber.DelIndex(0);
}
m_lstDamageNumber.num = 0;
m_dwUpperChrAction = CA_WAIT;
m_dwLowerChrAction = CA_WAIT;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
SetAction(CA_WAIT, CA_WAIT);
}
void CCreature::SetShape(char strShape[15][256])
{
for(int i = 0; i < 15; i++)
{
strcpy(m_strShape[i], strShape[i]);
}
if(m_lpChrModel == NULL) return;
if(m_cNation == 0) // Human
{
m_lpChrModel->BeginOutfitSetting();
m_lpChrModel->SetOutfitSlot("HEAD", m_strShape[0]);
m_lpChrModel->SetOutfitSlot("BODY", m_strShape[1]);
m_lpChrModel->SetOutfitSlot("BODY", m_strShape[2]);
m_lpChrModel->SetOutfitSlot("BODY", m_strShape[3]);
m_lpChrModel->SetOutfitSlot("HAND", m_strShape[4]);
m_lpChrModel->SetOutfitSlot("FOOT", m_strShape[5]);/**/
m_lpChrModel->EndOutfitSetting();
m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11 + m_dwWeaponPos]);
m_lpChrModel->SetAttachmentSlot("SHIELD", m_strShape[9 + m_dwWeaponPos]);
} else if(m_cNation == 1) // Akhan
{
m_lpChrModel->BeginOutfitSetting();
m_lpChrModel->SetOutfitSlot("HEAD", m_strShape[0]);
m_lpChrModel->SetOutfitSlot("BODY", m_strShape[3]);
m_lpChrModel->SetOutfitSlot("PELVIS", m_strShape[5]);/**/
m_lpChrModel->SetOutfitSlot("ARM", m_strShape[4]);
m_lpChrModel->SetOutfitSlot("SKILL", m_strShape[9]);
m_lpChrModel->EndOutfitSetting();
m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11]);
}
InitWeapon(1);
}
void CCreature::SkillAttack(unsigned long dwUpperAni, unsigned int dwLowerAni)
{
if(m_bUpperAble && m_bLowerAble)
{
SetAction(dwUpperAni, dwLowerAni);
}
}
BOOL CCreature::Jump()
{
BOOL bResult = FALSE;
if(m_bUpperAble && m_bLowerAble && !m_bSitMode)
{
if(m_dwLowerChrAction != CA_WAIT)
{
const char *strMotionSheet = m_lpChrModel->GetCurrentMotionSheetName();
if(strMotionSheet &&
(!strcmp(strMotionSheet, "CLASS_ROGUE") || !strcmp(strMotionSheet, "WEAPON_SHADOW_OFF") ||
!strcmp(strMotionSheet, "WEAPON_2CLAW") || !strcmp(strMotionSheet, "WEAPON_2DA")))
{
if(KeyPressed('W'))
bResult = SetAction(CA_FRONTDASH, CA_FRONTDASH);
else if(KeyPressed('S'))
{
}
else
SetAction(CA_JUMP, CA_JUMP);
} else
{
if(KeyPressed('W'))
bResult = SetAction(CA_FORWARDJUMP, CA_FORWARDJUMP);
else if(KeyPressed('S'))
bResult = SetAction(CA_BACKJUMP, CA_BACKJUMP);
else
SetAction(CA_JUMP, CA_JUMP);
}
m_bLowerAble = FALSE;
m_bLowerAble = FALSE;
}
else
{
SetAction(CA_JUMP, CA_JUMP);
m_vecJumpAttackVector = vector3(0.0f, 0.0f, 0.0f);
}
m_bFlying = TRUE;
//Jump sound//
char strSoundFilename[256];
sprintf(strSoundFilename, "%s%s",SOUNDFILEPATH,"jump.wav");
try
{
CSoundManager &sm = CSoundManager::GetInstance();
ISoundObject &sb = sm.GetBuffer(strSoundFilename,true,false,1);
int nBuffer;
nBuffer = sb.Play(false);
sb.SetPosition(nBuffer,m_vecPos.x,m_vecPos.y,m_vecPos.z);
sb.SetDistance(nBuffer,1000.0f,2000.0f);
}
catch(exception &e)
{
static bool bFirstShowMessage=false;
if(bFirstShowMessage==false)
{
MessageBox(NULL,e.what(),0,0);
bFirstShowMessage=true;
}
}
/////////////
return bResult;
}
return bResult;
}
BOOL CCreature::Dash(int nDir)
{
if(m_bUpperAble && !m_bSitMode)
{
/* m_bUpperAnimating = TRUE;
m_bLowerAnimating = TRUE;
m_bUpperAble = FALSE;
m_bLowerAble = FALSE;
*/
/*
CCameraControl::m_fCameraShakeRateTime=3000.0f/30.0f;
CCameraControl::m_fCameraShakeNowTime=0.0f;
CCameraControl::m_vecCameraShakeLength=vector3(10.0f,10.0f,10.0f);
*/
//CCameraControl::SetFadeOut(1000.0f,5000.0f,1000.0f);
//CCameraControl::SetFadeOut(30.0f,60.0f,30.0f);
/*
color c;
c.c=0xff660000;
*/
//CCameraControl::SetFadeIn(1.0f,2.0f,10.0f,c);
//SetFadeIn(float fStart,float fMaintenance,float fEnd,color FadeColor);
BOOL bResult;
switch(nDir)
{
case 0:
bResult = SetAction(CA_LEFTDASH, CA_LEFTDASH);
break;
case 1:
bResult = SetAction(CA_RIGHTDASH, CA_RIGHTDASH);
break;
case 2:
bResult = SetAction(CA_BACKDASH, CA_BACKDASH);
break;
}
m_bUpperAble = TRUE;
return bResult;
}
return FALSE;
}
void CCreature::BeginCast(char *strMotion)
{
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
unsigned long dwWeapon = CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos]);
if(dwWeapon != 14 && // STAFF
strcmp(strMotion, "AIMED_SHOT1"))
{
InitWeapon(0);
} else
{
if(m_cNation == 0)
{
InitWeapon(1);
} else if(m_cNation == 1)
{
InitWeapon(0);
}
}
SetAction(strMotion, strMotion);
}
void CCreature::EndSkill(char *strMotion)
{
m_bStillCasting = FALSE;
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
if(strcmp(strMotion, "FIRE1") && strcmp(strMotion, "FIRE2") &&
strcmp(strMotion, "SHOT") && strcmp(strMotion, "JUMP_SHOT"))
{
InitWeapon(1);
}
SetAction(strMotion, strMotion);
}
void CCreature::InitWeapon(unsigned long dwEquip)
{
if(m_lpChrModel)
{
switch(dwEquip)
{
case 0:
if(m_cNation == 0)
{
m_lpChrModel->SetMotionSheet("NO_WEAPON");
// m_lpChrModel->SetAttachmentSlot("ETC", "");
m_lpChrModel->SetAttachmentHolder("WEAPON", 0);
m_lpChrModel->SetAttachmentHolder("SHIELD", 2);
m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11 + m_dwWeaponPos]);
m_lpChrModel->SetAttachmentSlot("SHIELD", m_strShape[9 + m_dwWeaponPos]);
} else if(m_cNation == 1)
{
m_lpChrModel->SetMotionSheet("NO_WEAPON");
// m_lpChrModel->SetAttachmentSlot("ETC", "");
m_lpChrModel->SetAttachmentHolder("WEAPON", 0);
m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11]);
}
break;
case 1:
if(CCharacterControl::GetMotionSheet)
{
if(m_bSitMode)
{
InitWeapon(0);
} else
{
if(m_cNation == 0)
{
char *strMotionSheet = CCharacterControl::GetMotionSheet(m_strShape[11 + m_dwWeaponPos], m_strShape[9 + m_dwWeaponPos], m_wClass); // 모션시트 알아내기
m_lpChrModel->SetMotionSheet(strMotionSheet);
/* if(!strcmp(strMotionSheet, "WEAPON_BOW") || !strcmp(strMotionSheet, "WEAPON_CROSSBOW"))
{
m_lpChrModel->SetAttachmentSlot("ETC", "QUIVER");
} else
{
m_lpChrModel->SetAttachmentSlot("ETC", "");
}*/
if(!strcmp(strMotionSheet, "NO_WEAPON_B"))
{
m_bNoneComboAttackMode = FALSE;
} else
{
m_bNoneComboAttackMode = TRUE;
}
m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11 + m_dwWeaponPos]);
m_lpChrModel->SetAttachmentSlot("SHIELD", m_strShape[9 + m_dwWeaponPos]);
m_lpChrModel->SetAttachmentHolder("WEAPON", 1);
m_lpChrModel->SetAttachmentHolder("SHIELD", 3);
} else if(m_cNation == 1)
{
char *strMotionSheet = CCharacterControl::GetMotionSheet(m_strShape[11], m_strShape[9], m_wClass); // 모션시트 알아내기
m_lpChrModel->SetMotionSheet(strMotionSheet);
if(!strcmp(strMotionSheet, "NO_WEAPON_B"))
{
m_bNoneComboAttackMode = FALSE;
} else
{
m_bNoneComboAttackMode = TRUE;
}
m_lpChrModel->SetAttachmentSlot("WEAPON", m_strShape[11]);
m_lpChrModel->SetAttachmentHolder("WEAPON", 1);
}
}
} else // 클라이언트 외 처리
{
m_lpChrModel->SetMotionSheet("WEAPON_ONE_HAND");
m_lpChrModel->SetAttachmentHolder("WEAPON", 1);
m_bNoneComboAttackMode = TRUE;
/*
m_lpChrModel->SetAttachmentSlot("ETC", "");
m_lpChrModel->SetMotionSheet("WEAPON_ONE_HAND");
m_lpChrModel->SetAttachmentSlot("WEAPON","BASTARD_SWORD");
m_lpChrModel->SetAttachmentSlot("SHIELD","LARGE_SHIELD");
*/
}
break;
}
}
}
void CCreature::CancelSkill()
{
m_bStillCasting = FALSE;
if(m_dwUpperChrAction == CA_CASTING ||
m_dwUpperChrAction == CA_AIMEDSHOT1 || m_dwUpperChrAction == CA_AIMEDSHOT2 ||
m_dwUpperChrAction == CA_TURNPUNCH1 || m_dwUpperChrAction == CA_TURNPUNCH2)
{
m_bUpperAble = TRUE;
m_bLowerAble = TRUE;
m_bUpperAnimating = FALSE;
m_bLowerAnimating = FALSE;
m_dwUpperChrAction = CA_WAIT;
m_dwLowerChrAction = CA_WAIT;
Wait();
}
}
BOOL CCreature::Casting(unsigned long dwUpperAni, unsigned long dwLowerAni)
{
unsigned long dwWeapon = CCharacterControl::GetWeaponType(m_strShape[11 + m_dwWeaponPos]);
m_bStillCasting = TRUE;
if(m_bUpperAble)
{
if(dwWeapon != 14 && // STAFF
((dwLowerAni != CA_AIMEDSHOT1 && dwLowerAni != CA_AIMEDSHOT2) && (m_dwLowerChrAction != CA_AIMEDSHOT1 && m_dwLowerChrAction != CA_AIMEDSHOT2)))
{
InitWeapon(0);
} else
{
if(m_cNation == 0)
{
InitWeapon(1);
} else if(m_cNation == 1)
{
InitWeapon(0);
}
}
m_fRunFactor = 0.0f;
if(m_bSitMode) { CrouchAndStandup(); return TRUE; }
unsigned long dwUpperAni2, dwLowerAni2;
if(dwUpperAni == 0xFFFFFFFF && dwLowerAni == 0xFFFFFFFF)
{
if(m_dwLowerChrAction == CA_AIMEDSHOT1)
{
dwUpperAni2 = CA_AIMEDSHOT2;
dwLowerAni2 = CA_AIMEDSHOT2;
} else if(m_dwLowerChrAction == CA_TURNPUNCH1)
{
dwUpperAni2 = CA_TURNPUNCH2;
dwLowerAni2 = CA_TURNPUNCH2;
} else
{
dwUpperAni2 = m_dwUpperChrAction;
dwLowerAni2 = m_dwLowerChrAction;
}
} else
{
dwUpperAni2 = dwUpperAni;
dwLowerAni2 = dwLowerAni;
}
return SetAction(dwUpperAni2, dwLowerAni2);
}
return FALSE;
}
void CCreature::ArrowUpdate() {
// 몸에 맞은 화살들 업데이트
if(m_bArrowExist) {
int i;
for(i=0;i<m_Arrow.size();i++) {
if(CSceneManager::m_EffectManager.CheckNullScript(m_Arrow[i]->m_ArrowEsf)) //delete
DeleteArrow(i);
if(m_Arrow[i] != NULL) {
D3DXVECTOR3 bodypos;
D3DXVECTOR3 effectfwd;
CZ3DObject *body;
if(m_lpChrModel != NULL) {
body = m_lpChrModel->GetSkeletonPartObject(m_Arrow[i]->m_PivotName);
if(body != NULL) {
/*matrix *body_tm = body->GetTM();
bodypos.x = body_tm->_41;
bodypos.y = body_tm->_42;
bodypos.z = body_tm->_43;
*/
vector3 body_tm;
quaternion body_q;
D3DXQUATERNION tmp;
float body_scale = 0.0f;
body_scale = m_lpChrModel->GetScale();
body->GetDirection(body_q);
body->GetPosition(body_tm);
bodypos.x = body_tm.x;
bodypos.y = body_tm.y;
bodypos.z = body_tm.z;
bodypos *= body_scale;
tmp.x = body_q.x;
tmp.y = body_q.y;
tmp.z = body_q.z;
tmp.w = body_q.w;
m_Arrow[i]->m_ArrowEsf->SetExt4Rot(tmp);
m_Arrow[i]->m_ArrowEsf->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z);
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
m_Arrow[i]->m_ArrowEsf->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
}
else {
delete m_Arrow[i];
m_Arrow[i] = NULL;
m_Arrow.erase(&(m_Arrow[i]));
}
}
else {
delete m_Arrow[i];
m_Arrow[i] = NULL;
m_Arrow.erase(&(m_Arrow[i]));
}
}
}
}
}
void CCreature::ArrowUpdate(int i) {
if(m_Arrow[i] != NULL) {
D3DXVECTOR3 bodypos;
D3DXVECTOR3 effectfwd;
CZ3DObject *body;
if(m_lpChrModel != NULL) {
body = m_lpChrModel->GetSkeletonPartObject(m_Arrow[i]->m_PivotName);
if(body != NULL) {
/*matrix *body_tm = body->GetTM();
bodypos.x = body_tm->_41;
bodypos.y = body_tm->_42;
bodypos.z = body_tm->_43;
*/
vector3 body_tm;
quaternion body_q;
D3DXQUATERNION tmp;
body->GetPosition(body_tm);
body->GetDirection(body_q);
float body_scale = 0.0f;
body_scale = m_lpChrModel->GetScale();
bodypos.x = body_tm.x;
bodypos.y = body_tm.y;
bodypos.z = body_tm.z;
bodypos *= body_scale;
tmp.x = body_q.x;
tmp.y = body_q.y;
tmp.z = body_q.z;
tmp.w = body_q.w;
m_Arrow[i]->m_ArrowEsf->SetExt4Rot(tmp);
m_Arrow[i]->m_ArrowEsf->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z);
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
m_Arrow[i]->m_ArrowEsf->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
}
else {
delete m_Arrow[i];
m_Arrow[i] = NULL;
m_Arrow.erase(&(m_Arrow[i]));
}
}
else {
delete m_Arrow[i];
m_Arrow[i] = NULL;
m_Arrow.erase(&(m_Arrow[i]));
}
}
}
void CCreature::AddArrow(char *pivot,D3DXQUATERNION rot,int division) {
CCreatureArrow *AddNode;
AddNode = new CCreatureArrow;
strcpy(AddNode->m_PivotName,pivot);
if(m_Arrow.size() > 2) { // 화살갯수 제한
delete m_Arrow[0];
m_Arrow.erase(&m_Arrow[0]);
}
m_Arrow.push_back(AddNode);
m_bArrowExist = true;
AddNode->m_ArrowEsf = new CEffScript;
AddNode->m_ArrowEsf->SetExt4SelfInfo(rot);
CSceneManager::AddEffectScript((AddNode->m_ArrowEsf));
switch(division) {
case 0:
if(rand() % 2)
AddNode->m_ArrowEsf->GetScriptData("arrow_body.esf");
else
AddNode->m_ArrowEsf->GetScriptData("arrow_body2.esf");
break;
case 1:
AddNode->m_ArrowEsf->GetScriptData("dagger_body1.esf");
break;
case 2:
AddNode->m_ArrowEsf->GetScriptData("dagger_body2.esf");
break;
case 3:
AddNode->m_ArrowEsf->GetScriptData("dagger_body3.esf");
break;
case 4:
AddNode->m_ArrowEsf->GetScriptData("dagger_body4.esf");
break;
case 5:
AddNode->m_ArrowEsf->GetScriptData("dagger_body5.esf");
break;
}
ArrowUpdate(m_Arrow.size() -1);
}
void CCreature::SetSlideValue(CEffScript::CEffExt6 value){
m_SlideValue = value;
m_bSlide = true;
}
void CCreature::PlaySlide() {
if(GetChantFlag(25)) { // hold시 slide 작동 x
m_bSlide = false;
return ;
}
if(m_bSlide) {
float fChrDir = GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
vector3 tmp;
vector3 *char_pos;
float tmp_length;
if(m_SlideValue.m_CurrentSlideLength < m_SlideValue.m_SlideLength)
{
tmp = vecChrToward * (m_SlideValue.m_SlideSpeed);
tmp *= (-1.0f);
m_SlideValue.m_SlideSpeed += m_SlideValue.m_SlideAccel;
if(m_SlideValue.m_SlideAccel <= 0.0f)
{
if(m_SlideValue.m_SlideSpeed < m_SlideValue.m_LimitSpeed)
m_SlideValue.m_SlideSpeed = m_SlideValue.m_LimitSpeed;
}
else
{
if(m_SlideValue.m_SlideSpeed > m_SlideValue.m_LimitSpeed)
m_SlideValue.m_SlideSpeed = m_SlideValue.m_LimitSpeed;
}
}
else
{
tmp.x = 0.0f;
tmp.y = 0.0f;
tmp.z = 0.0f;
m_bSlide = false;
}
tmp_length = tmp.GetLens();
m_SlideValue.m_CurrentSlideLength += tmp_length;
vector3 before_pos;
char_pos = GetPosition();
before_pos.x = char_pos->x;
before_pos.y = char_pos->y;
before_pos.z = char_pos->z;
SetPosition(char_pos->x + tmp.x,char_pos->y,char_pos->z + tmp.z);
// slide 먼지 render
if(m_bSlide && (!m_bFlying))
//RenderSlide(before_pos.x - tmp.x,before_pos.y,before_pos.z - tmp.x,char_pos->x - tmp.x,char_pos->y,char_pos->z - tmp.x,30.0f);
RenderSlide(before_pos.x,before_pos.y,before_pos.z,char_pos->x,char_pos->y,char_pos->z,30.0f);
/*if(m_SlideEffect != NULL && m_bSlide) { //snap
if(!CSceneManager::m_EffectManager.CheckNullScript(m_SlideEffect)) {
m_SlideEffect->SetSnapPos(char_pos->x + tmp.x,char_pos->y,char_pos->z + tmp.z);
}
else
m_SlideEffect = NULL;
}*/
}
}
void CCreature::RenderSlide(float beforex,float beforey,float beforez,float nowx,float nowy,float nowz,float unitsize) {
//unitsize : 이팩트 사이 간격
float vec_length = 0.0f;
int unitcount = 0;
D3DXVECTOR3 tmp_vec;
D3DXVECTOR3 tmp_vec2(0.0f,0.0f,0.0f);
D3DXVECTOR3 r_foot;
D3DXVECTOR3 l_foot;
tmp_vec.x = nowx - beforex;
tmp_vec.y = nowy - beforey;
tmp_vec.z = nowz - beforez;
vec_length = D3DXVec3Length(&tmp_vec);
D3DXVec3Normalize(&tmp_vec,&tmp_vec);
CZ3DObject *snappoint = NULL;
float body_scale = 0.0f;
if(m_lpChrModel == NULL) //model 이 NULL 일때 skip
return;
//rfoot
snappoint = m_lpChrModel->GetSkeletonPartObject("R_FOOT");
body_scale = m_lpChrModel->GetScale();
if(snappoint != NULL) {
vector3 snaptm;
snappoint->GetPosition(snaptm);
r_foot.x = snaptm.x;
r_foot.y = snaptm.y;
r_foot.z = snaptm.z;
r_foot *= body_scale;
}
//lfoot
snappoint = m_lpChrModel->GetSkeletonPartObject("L_FOOT");
body_scale = m_lpChrModel->GetScale();
if(snappoint != NULL) {
vector3 snaptm;
snappoint->GetPosition(snaptm);
l_foot.x = snaptm.x;
l_foot.y = snaptm.y;
l_foot.z = snaptm.z;
l_foot *= body_scale;
}
while(vec_length > D3DXVec3Length(&tmp_vec2)) {
// 이번에 미끌린 거리와 그 이전의 위치 사이에 effect 출력
D3DXVECTOR3 effectpos(nowx,nowy,nowz);
tmp_vec2 += tmp_vec * unitsize;
//rfoot
CX3DEffect *pEffect = NULL;
pEffect=new CX3DEffect;
CSceneManager::AddEffect(pEffect);
pEffect->Load(EFFECTPATH,"smoke.eff");
pEffect->SetLoop(FALSE);
pEffect->SetAxis(0.0f,0.0f,0.0f);
pEffect->SetCenter(effectpos.x - tmp_vec2.x + r_foot.x,
effectpos.y - tmp_vec2.y + r_foot.y + 20.0f,
effectpos.z - tmp_vec2.z + r_foot.z);
pEffect->SetFrame((float)(unitcount * 2.0f));
//lfoot
CX3DEffect *pEffect2 = NULL;
pEffect2=new CX3DEffect;
CSceneManager::AddEffect(pEffect2);
pEffect2->Load(EFFECTPATH,"smoke.eff");
pEffect2->SetLoop(FALSE);
pEffect2->SetAxis(0.0f,0.0f,0.0f);
pEffect2->SetCenter(effectpos.x - tmp_vec2.x + l_foot.x,
effectpos.y - tmp_vec2.y + l_foot.y + 20.0f,
effectpos.z - tmp_vec2.z + l_foot.z);
pEffect2->SetFrame((float)(unitcount * 2.0f));
unitcount++;
}
}
void CCreature::DeleteArrow(int index) {
int i;
for(i=0;i<m_Arrow.size();i++) {
delete m_Arrow[i];
m_Arrow[i] = NULL;
//m_Arrow.erase(&(m_Arrow[i]));
}
m_Arrow.clear();
}
void CCreature::DeleteBodyEffect(unsigned long id) { //effect id로 delete
int i;
for( i = m_BodyEffect.size() - 1; i >= 0; i-- )
{
if(m_BodyEffect[i]->m_EffId == id) {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
if(m_BodyEffect.size() <= 0) {
m_bBodyEffect = false;
m_BodyEffect.clear();
}
}
void CCreature::DeleteBodyEffect(char *pivot) {
int i;
if(pivot != NULL)
{
for( i = m_BodyEffect.size() - 1; i >= 0; i-- )
{
if(strlen(m_BodyEffect[i]->m_PivotName) > 1) {
if(!strcmp(m_BodyEffect[i]->m_PivotName,pivot)) {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
}
if(m_BodyEffect.size() <= 0) {
m_bBodyEffect = false;
m_BodyEffect.clear();
}
}
/*
int i;
if(pivot != NULL){
for(i=0;i<m_BodyEffect.size();i++) {
if(strlen(m_BodyEffect[i]->m_PivotName) > 1) {
if(!strcmp(m_BodyEffect[i]->m_PivotName,pivot)) {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
}
if(m_BodyEffect.size() <= 0) {
m_bBodyEffect = false;
m_BodyEffect.clear();
}
}
*/
}
void CCreature::DeleteBodyEffectName(char *effectname) {
int i;
for(i = m_BodyEffect.size() - 1; i >= 0; i-- )
{
if(!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect)) {
if(!strcmp(effectname,m_BodyEffect[i]->m_Effect->m_FileName)) {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
else {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
if(m_BodyEffect.size() <= 0) {
m_bBodyEffect = false;
m_BodyEffect.clear();
}
}
void CCreature::DeleteBodyEffect() {
int i;
for( i = m_BodyEffect.size() - 1; i >= 0; i-- )
{
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
}
m_bBodyEffect = false;
m_BodyEffect.clear();
}
//현재 body effect list안에 이 이팩트가 존재 하는지 검사
bool CCreature::CheckInBodyEffect(char *file) {
int i;
for(i=0;i<m_BodyEffect.size();i++) {
if(strstr(m_BodyEffect[i]->m_Effect->m_FileName,file) != NULL)
return true;
}
return false;
}
// pivot index에 effect 붙임
void CCreature::AddBodyEffect(char *filename,int pivotindex,bool rot,unsigned long effid) {
char *ptr = strrchr(filename,'.');
D3DXQUATERNION tmpquat(0.0f,0.0f,0.0f,1.0f);
long pivotnum = 0;
if(!m_lpChrModel)
return;
m_lpChrModel->GetSkeletonSet(&pivotnum);
if((filename == NULL) || (pivotindex < 0) || (pivotindex >= pivotnum))
return;
if(!m_lpChrModel)
return;
/* if(CheckInBodyEffect(filename)) { // 기존에 있던 같은 종류의 effect 를 삭제후 이번 것을 올린다.
DeleteBodyEffectName(filename);
}
*/
m_bBodyEffect = true;
CCreatureEffect *tmp_node = NULL;
tmp_node = new CCreatureEffect;
m_BodyEffect.push_back(tmp_node);
if(strstr(ptr,"eff") != NULL) { //'snap' eff use
tmp_node->m_EffValue = true;
tmp_node->m_bPivotRot = rot;
tmp_node->m_PivotIndex = pivotindex;
tmp_node->m_EffId = effid;
strcpy(tmp_node->m_EffName,filename);
}
else { //'snap' esf use
tmp_node->m_EffId = effid;
tmp_node->m_EffValue = false;
tmp_node->m_bPivotRot = rot;
tmp_node->m_Effect = new CEffScript;
tmp_node->m_Effect->GetScriptData(filename);
if(rot)
tmp_node->m_Effect->SetExt4SelfInfo(tmpquat);
tmp_node->m_PivotIndex = pivotindex;
CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect);
}
BodyEffectUpdate(m_BodyEffect.size() -1);
}
// pivot 하나에 effect 붙임
void CCreature::AddBodyEffect(char *filename,char *pivot,bool rot,unsigned long effid) {
char *ptr = strrchr(filename,'.');
D3DXQUATERNION tmpquat(0.0f,0.0f,0.0f,1.0f);
if((filename == NULL) || (pivot == NULL))
return;
if(!m_lpChrModel)
return;
/* if(CheckInBodyEffect(filename)) { // 기존에 있던 같은 종류의 effect 를 삭제후 이번 것을 올린다.
DeleteBodyEffectName(filename);
}
*/
m_bBodyEffect = true;
CCreatureEffect *tmp_node = NULL;
tmp_node = new CCreatureEffect;
m_BodyEffect.push_back(tmp_node);
if(strstr(ptr,"eff") != NULL) { //snap eff use
tmp_node->m_EffId = effid;
tmp_node->m_EffValue = true;
tmp_node->m_bPivotRot = rot;
strcpy(tmp_node->m_PivotName,pivot);
strcpy(tmp_node->m_EffName,filename);
}
else { //'snap' esf use
tmp_node->m_EffId = effid;
tmp_node->m_bPivotRot = rot;
tmp_node->m_Effect = new CEffScript;
tmp_node->m_Effect->GetScriptData(filename);
strcpy(tmp_node->m_PivotName,pivot);
if(rot)
tmp_node->m_Effect->SetExt4SelfInfo(tmpquat);
CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect);
}
BodyEffectUpdate(m_BodyEffect.size() -1);
}
// pivot 중에 렌덤 하게 num 갯수 만큼 effect 붙임 (num 값이 -1이면 전 pivot 에 다 붙임)
void CCreature::AddBodyEffect(char *filename,bool rot,unsigned long effid,int num) {
int i;
long pivotnum = 0;
D3DXQUATERNION tmpquat(0.0f,0.0f,0.0f,1.0f);
if(!m_lpChrModel)
return;
m_lpChrModel->GetSkeletonSet(&pivotnum);
if(pivotnum <= 0)
return;
if((filename == NULL) || (strlen(filename) < 1))
return;
/* if(CheckInBodyEffect(filename)) { // 기존에 있던 같은 종류의 effect 를 삭제후 이번 것을 올린다.
DeleteBodyEffectName(filename);
}
*/
m_bBodyEffect = true;
if(num >0) {
for(i=0;i<num;i++) {
CCreatureEffect *tmp_node = NULL;
tmp_node = new CCreatureEffect;
m_BodyEffect.push_back(tmp_node);
tmp_node->m_EffId = effid;
tmp_node->m_bPivotRot = rot;
tmp_node->m_Effect = new CEffScript;
tmp_node->m_Effect->GetScriptData(filename);
tmp_node->m_PivotIndex = rand() % pivotnum;
if(rot)
tmp_node->m_Effect->SetExt4SelfInfo(tmpquat);
CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect);
BodyEffectUpdate(m_BodyEffect.size() -1);
}
}
else if(num == -1) { // 전 pivot에 effect 붙임
for(i=0;i<pivotnum;i++) {
CCreatureEffect *tmp_node = NULL;
tmp_node = new CCreatureEffect;
m_BodyEffect.push_back(tmp_node);
tmp_node->m_bPivotRot = rot;
tmp_node->m_Effect = new CEffScript;
tmp_node->m_Effect->GetScriptData(filename);
tmp_node->m_PivotIndex = i;
tmp_node->m_EffId = effid;
if(rot)
tmp_node->m_Effect->SetExt4SelfInfo(tmpquat);
CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect);
BodyEffectUpdate(m_BodyEffect.size() -1);
}
}
else { // num 0
return;
}
}
// 캐릭의 센터에 effect 붙일경우
void CCreature::AddBodyEffect(char *filename,unsigned long effid,bool mine,bool bvis) {
if(!m_lpChrModel)
return;
if((filename == NULL) || (strlen(filename) < 1))
return;
if(CheckInBodyEffect(filename)) { // 기존에 같은 종류의 effect 가 있다면 이번것 무시.
return;
//DeleteBodyEffectName(filename);
}
m_bBodyEffect = true;
CCreatureEffect *tmp_node = NULL;
tmp_node = new CCreatureEffect;
m_BodyEffect.push_back(tmp_node);
tmp_node->m_bPivotRot = false;
tmp_node->m_EffId = effid;
tmp_node->m_Effect = new CEffScript;
tmp_node->m_Effect->GetScriptData(filename);
//누구의 것인지
tmp_node->m_Effect->SetMine(mine);
tmp_node->m_Effect->SetChant(true);
//////////////// Monster Effect
// 캐릭 방향 생성
float fChrDir = m_fDirection;
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
tmp_node->m_Effect->SetChr(m_lpChrModel,m_lpChrModel);
tmp_node->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
////////////////
CSceneManager::m_EffectManager.AddEffScript(tmp_node->m_Effect);
BodyEffectUpdate(m_BodyEffect.size() -1);
}
void CCreature::BodyEffectUpdate(int i) {
if(m_BodyEffect[i] != NULL) {
D3DXVECTOR3 bodypos;
D3DXVECTOR3 effectfwd;
//modified by Ppu // CZ3DObject body;
CZ3DObject* body;
CZ3DSkeletonObject *pivotarray = NULL;
long pivotnum = 0;
if(m_lpChrModel != NULL) {
if(m_BodyEffect[i]->m_PivotIndex != -1) {
pivotarray = m_lpChrModel->GetSkeletonSet(&pivotnum);
}
else if(strlen(m_BodyEffect[i]->m_PivotName) > 1){
CZ3DObject *tmp_ptr = NULL;
tmp_ptr = m_lpChrModel->GetSkeletonPartObject(m_BodyEffect[i]->m_PivotName);
if(tmp_ptr == NULL) {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
return;
}
//modified by Ppu // body = (*tmp_ptr);
body = tmp_ptr;
}
else {
vector3 charpos = m_lpChrModel->GetPosition();
m_BodyEffect[i]->m_Effect->SetStartPos(charpos.x,charpos.y,charpos.z);
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
return ;
}
if(1) {
vector3 body_tm;
quaternion body_q;
D3DXQUATERNION tmp;
if(m_BodyEffect[i]->m_PivotIndex!=-1) {
pivotarray[m_BodyEffect[i]->m_PivotIndex].GetPosition(body_tm);
pivotarray[m_BodyEffect[i]->m_PivotIndex].GetDirection(body_q);
}
else {
//modified by Ppu // body.GetPosition(body_tm);
//modified by Ppu // body.GetDirection(body_q);
body->GetPosition(body_tm);
body->GetDirection(body_q);
}
float body_scale = 0.0f;
body_scale = m_lpChrModel->GetScale();
bodypos.x = body_tm.x;
bodypos.y = body_tm.y;
bodypos.z = body_tm.z;
bodypos *= body_scale;
tmp.x = body_q.x;
tmp.y = body_q.y;
tmp.z = body_q.z;
tmp.w = body_q.w;
if(m_BodyEffect[i]->m_EffValue) { //m_BodyEffect[i] use eff file
///////////
m_BodyEffect[i]->m_EffPos.x = m_vecPos.x + bodypos.x;
m_BodyEffect[i]->m_EffPos.y = m_vecPos.y + bodypos.y;
m_BodyEffect[i]->m_EffPos.z = m_vecPos.z + bodypos.z;
//////////
}
else { // m_BodyEffect[i] use esf file
if(m_BodyEffect[i]->m_bPivotRot)
m_BodyEffect[i]->m_Effect->SetExt4Rot(tmp);
m_BodyEffect[i]->m_Effect->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z);
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
}
}
else {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
else {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
}
void CCreature::BodyEffectUpdate() {
if(m_bBodyEffect) {
int i;
for(i=0;i<m_BodyEffect.size();i++) {
if((m_BodyEffect[i] != NULL) && (m_BodyEffect[i]->m_EffValue || (!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect)))) {
D3DXVECTOR3 bodypos;
D3DXVECTOR3 effectfwd;
//modified by Ppu // CZ3DObject body;
CZ3DObject* body;
CZ3DSkeletonObject *pivotarray = NULL;
long pivotnum = 0;
if(m_lpChrModel != NULL) {
if(m_BodyEffect[i]->m_PivotIndex != -1) {
pivotarray = m_lpChrModel->GetSkeletonSet(&pivotnum);
}
else if(strlen(m_BodyEffect[i]->m_PivotName)>1){
CZ3DObject *tmp_ptr = NULL;
tmp_ptr = m_lpChrModel->GetSkeletonPartObject(m_BodyEffect[i]->m_PivotName);
if(tmp_ptr == NULL) {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
return;
}
//modified by Ppu // body = (*tmp_ptr);
body = tmp_ptr;
}
else {
vector3 charpos = m_lpChrModel->GetPosition();
m_BodyEffect[i]->m_Effect->SetStartPos(charpos.x,charpos.y,charpos.z);
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
continue;
}
if(1) {
vector3 body_tm;
quaternion body_q;
D3DXQUATERNION tmp;
float body_scale = 0.0f;
body_scale = m_lpChrModel->GetScale();
if(m_BodyEffect[i]->m_PivotIndex != -1) {
pivotarray[m_BodyEffect[i]->m_PivotIndex].GetPosition(body_tm);
pivotarray[m_BodyEffect[i]->m_PivotIndex].GetDirection(body_q);
}
else {
//modified by Ppu // body.GetDirection(body_q);
//modified by Ppu // body.GetPosition(body_tm);
body->GetDirection(body_q);
body->GetPosition(body_tm);
}
bodypos.x = body_tm.x;
bodypos.y = body_tm.y;
bodypos.z = body_tm.z;
bodypos *= body_scale;
tmp.x = body_q.x;
tmp.y = body_q.y;
tmp.z = body_q.z;
tmp.w = body_q.w;
if(m_BodyEffect[i]->m_EffValue) { //m_BodyEffect[i] use eff file
///////////
//snap effect render(30.0f : effect 간격)
RenderSnap(m_BodyEffect[i]->m_EffPos.x,m_BodyEffect[i]->m_EffPos.y,m_BodyEffect[i]->m_EffPos.z,
m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z,30.0f,m_BodyEffect[i]->m_EffName);
m_BodyEffect[i]->m_EffPos.x = m_vecPos.x + bodypos.x;
m_BodyEffect[i]->m_EffPos.y = m_vecPos.y + bodypos.y;
m_BodyEffect[i]->m_EffPos.z = m_vecPos.z + bodypos.z;
//////////
}
else { //m_BodyEffect[i] use esf file
if(m_BodyEffect[i]->m_bPivotRot)
m_BodyEffect[i]->m_Effect->SetExt4Rot(tmp);
m_BodyEffect[i]->m_Effect->SetStartPos(m_vecPos.x + bodypos.x,m_vecPos.y + bodypos.y,m_vecPos.z + bodypos.z);
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
m_BodyEffect[i]->m_Effect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
}
}
else {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
else {
delete m_BodyEffect[i];
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}
else {//if((m_BodyEffect[i] != NULL) && (!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect))) {
if(!CSceneManager::m_EffectManager.CheckNullScript(m_BodyEffect[i]->m_Effect)) {
delete m_BodyEffect[i];
}
m_BodyEffect[i] = NULL;
m_BodyEffect.erase(&(m_BodyEffect[i]));
}
}//for
}//if
}
void CCreature::SetEffect() { // 나중에 character에 effect 붙일때 쓰는 코드
// GCMDS 에서 캐릭에 붙는 effect filename과 pivot 명을 넘겨줌
/* if(m_lpChrModel != NULL) {
//if(strstr(m_lpChrModel->GetGCMDSFileName(),"PC_Akhan_A.GCMDS") != NULL) {
long effectnum = 0;
const Z3D_EFFECT_INFO **ChrEffect;
effectnum = m_lpChrModel->GetEffectInfoList(ChrEffect);
DeleteBodyEffect();
for(int i=0;i<effectnum;i++) {
AddBodyEffect(ChrEffect[i]->szESFName,ChrEffect[i]->szSkelName,true);
}
//}
}
*/
}
void CCreature::RenderSnap(float beforex,float beforey,float beforez,float nowx,float nowy,float nowz,float unitsize,char *eff) {
// snap effect 중 eff 를 이용하는 것들.
//unitsize : 이팩트 사이 간격
float vec_length = 0.0f;
int unitcount = 0;
D3DXVECTOR3 tmp_vec;
D3DXVECTOR3 tmp_vec2(0.0f,0.0f,0.0f);
tmp_vec.x = nowx - beforex;
tmp_vec.y = nowy - beforey;
tmp_vec.z = nowz - beforez;
vec_length = D3DXVec3Length(&tmp_vec);
D3DXVec3Normalize(&tmp_vec,&tmp_vec);
while(vec_length > D3DXVec3Length(&tmp_vec2)) {
D3DXVECTOR3 effectpos(nowx,nowy,nowz);
tmp_vec2 += tmp_vec * unitsize;
//rfoot
CX3DEffect *pEffect = NULL;
pEffect=new CX3DEffect;
CSceneManager::AddEffect(pEffect);
pEffect->Load(EFFECTPATH,eff);
pEffect->SetLoop(FALSE);
pEffect->SetAxis(0.0f,0.0f,0.0f);
pEffect->SetCenter(effectpos.x - tmp_vec2.x,
effectpos.y - tmp_vec2.y,
effectpos.z - tmp_vec2.z);
pEffect->SetFrame((float)(unitcount * 2.0f));
unitcount++;
}
}
BOOL CCreature::GetSkillMotion()
{
if(m_dwLowerChrAction == CA_SHOT || m_dwLowerChrAction == CA_JUMPSHOT || m_dwLowerChrAction == CA_FIRE1 ||
m_dwLowerChrAction == CA_FIRE2 || m_dwLowerChrAction == CA_AIMEDSHOT1 || m_dwLowerChrAction == CA_AIMEDSHOT2 ||
m_dwLowerChrAction == CA_AIMEDSHOT3 || m_dwLowerChrAction == CA_OVERBASH1 || m_dwLowerChrAction == CA_OVERBASH2 ||
m_dwLowerChrAction == CA_OVERBASH3 || m_dwLowerChrAction == CA_OVERBASH4 || m_dwLowerChrAction == CA_OVERBASH5 ||
m_dwLowerChrAction == CA_TURNPUNCH1 || m_dwLowerChrAction == CA_TURNPUNCH2 || m_dwLowerChrAction == CA_TURNPUNCH3 ||
m_dwLowerChrAction == CA_COMBINATIONBLOW || m_dwLowerChrAction == CA_BACKSTAB || m_dwLowerChrAction == CA_POWERDRAIN ||
m_dwLowerChrAction == CA_BASH || m_dwLowerChrAction == CA_ROUNDSWING)
{
return TRUE;
}
return FALSE;
}
void CCreature::SetChantEffect(unsigned long dwChant, BOOL bSelf)
{
unsigned long i, dwChantFlag;
for(i = 0; i < 32; i++)
{
dwChantFlag = 0x00000001 << i;
if(dwChant & dwChantFlag)
SetChantEffect(i + 1, TRUE, bSelf);
else
SetChantEffect(i + 1, FALSE, bSelf);
}
m_dwChant = dwChant;
}
void CCreature::SetChantEffect(unsigned long dwChant, BOOL bToggle, BOOL bSelf)
{
bool bMySelf;
if(bSelf) bMySelf = true; else bMySelf = false;
if(bToggle)
{
switch(dwChant)
{
case 1:
AddBodyEffect("Chant_BattleSong.esf",(unsigned long)0, bMySelf);
break;
case 2:
AddBodyEffect("Chant_MaintenanceChant.esf",(unsigned long)0, bMySelf);
break;
case 3:
AddBodyEffect("Chant_AccelerationChant.esf",(unsigned long)0, bMySelf);
break;
case 4:
AddBodyEffect("Chant_LifeAura.esf",(unsigned long)0, bMySelf);
break;
case 17:
break;
case 18:
AddBodyEffect("Chant_ManaShell2.esf",(unsigned long)0, bMySelf);
break;
case 19:
AddBodyEffect("Chant_Encourage.esf",(unsigned long)0, bMySelf);
break;
case 20:
AddBodyEffect("Chant_EnchantWeapon.esf",(unsigned long)0, bMySelf);
break;
case 21:
AddBodyEffect("Chant_BrightArmor.esf",(unsigned long)0, bMySelf);
break;
case 22:
AddBodyEffect("Chant_HardenSkin.esf",(unsigned long)0, bMySelf);
break;
case 23:
AddBodyEffect("Chant_Flexibility.esf",(unsigned long)0, bMySelf);
break;
case 24:
AddBodyEffect("Chant_Guard.esf",(unsigned long)0, bMySelf);
break;
case 25:
AddBodyEffect("Chant_Hold.esf",(unsigned long)0, bMySelf);
break;
case 26:
AddBodyEffect("Chant_Stun.esf",(unsigned long)0, bMySelf);
break;
case 27:
AddBodyEffect("Chant_Frozen.esf",(unsigned long)0, bMySelf);
break;
case 28:
AddBodyEffect("Chant_Poisoned.esf",(unsigned long)0, bMySelf);
break;
case 29:
AddBodyEffect("Chant_LowerStrength.esf",(unsigned long)0, bMySelf);
break;
}
m_dwChant += (0x00000001 << (dwChant - 1));
} else
{
switch(dwChant)
{
case 1:
DeleteBodyEffectName("Chant_BattleSong.esf");
break;
case 2:
DeleteBodyEffectName("Chant_MaintenanceChant.esf");
break;
case 3:
DeleteBodyEffectName("Chant_AccelerationChant.esf");
break;
case 4:
DeleteBodyEffectName("Chant_LifeAura.esf");
break;
case 17:
break;
case 18:
DeleteBodyEffectName("Chant_ManaShell2.esf");
break;
case 19:
DeleteBodyEffectName("Chant_Encourage.esf");
break;
case 20:
DeleteBodyEffectName("Chant_EnchantWeapon.esf");
break;
case 21:
DeleteBodyEffectName("Chant_BrightArmor.esf");
break;
case 22:
DeleteBodyEffectName("Chant_HardenSkin.esf");
break;
case 23:
DeleteBodyEffectName("Chant_Flexibility.esf");
break;
case 24:
DeleteBodyEffectName("Chant_Guard.esf");
break;
case 25:
DeleteBodyEffectName("Chant_Hold.esf");
break;
case 26:
DeleteBodyEffectName("Chant_Stun.esf");
break;
case 27:
DeleteBodyEffectName("Chant_Frozen.esf");
break;
case 28:
DeleteBodyEffectName("Chant_Poisoned.esf");
break;
case 29:
DeleteBodyEffectName("Chant_LowerStrength.esf");
break;
}
m_dwChant -= (0x00000001 << (dwChant - 1));
}
}
void CCreature::SetWeaponLine(LPDIRECT3DTEXTURE8 lpTexture,int iColor[3],int iBlend)
{
m_bWeaponLine = true;
if(m_pWeaponLine == NULL)
m_pWeaponLine = new CWeaponLine;
m_pWeaponLine->m_lpLineTexture = lpTexture;
m_pWeaponLine->m_iBlend = iBlend;
if(iColor[0] == -1)
m_pWeaponLine->m_iColor[0] = rand() % 256;
else
m_pWeaponLine->m_iColor[0] = iColor[0];
if(iColor[1] == -1)
m_pWeaponLine->m_iColor[1] = rand() % 256;
else
m_pWeaponLine->m_iColor[1] = iColor[1];
if(iColor[2] == -1)
m_pWeaponLine->m_iColor[2] = rand() % 256;
else
m_pWeaponLine->m_iColor[2] = iColor[2];
}
void CCreature::DeleteWeaponLine()
{
if((m_lpChrModel != NULL) && (m_bWeaponLine == true) && (m_pWeaponLine != NULL)) {
// WEAPON 슬롯에 들어있는 무기 class Get
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
if(pWp == NULL) //무기 존재하지 않을때
return;
CZ3DBladeTrail* pBladeTrail = pWp->GetBladeTrailInterface();
if( pBladeTrail )
{ // 초기 검기 복구
pBladeTrail->SetRGB(255,255,255);
pBladeTrail->SetTexture((LPDIRECT3DTEXTURE8)NULL);
pBladeTrail->SetSecondRenderBlend(D3DBLEND_SRCALPHA, D3DBLEND_ONE );
}
delete m_pWeaponLine;
m_pWeaponLine = NULL;
m_bWeaponLine = false;
}
else
{
delete m_pWeaponLine;
m_pWeaponLine = NULL;
m_bWeaponLine = false;
}
}
void CCreature::WeaponLineUpdate()
{
if((m_lpChrModel != NULL) && (m_bWeaponLine == true) && (m_pWeaponLine != NULL)) {
// WEAPON 슬롯에 들어있는 무기 class Get
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
if(pWp == NULL) //무기 존재하지 않을때
return;
CZ3DBladeTrail* pBladeTrail = pWp->GetBladeTrailInterface();
if( pBladeTrail )
{
pBladeTrail->SetRGB( m_pWeaponLine->m_iColor[0], //R
m_pWeaponLine->m_iColor[1], //G
m_pWeaponLine->m_iColor[2]); //B
if(m_pWeaponLine->m_lpLineTexture != NULL)
pBladeTrail->SetTexture( m_pWeaponLine->m_lpLineTexture ); // Texture
else
pBladeTrail->SetTexture((LPDIRECT3DTEXTURE8)NULL);
switch(m_pWeaponLine->m_iBlend) {
case 0:
pBladeTrail->SetSecondRenderBlend(D3DBLEND_SRCALPHA, D3DBLEND_ONE );
break;
case 1:
pBladeTrail->SetSecondRenderBlend(D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA );
break;
case 2:
pBladeTrail->SetSecondRenderBlend(D3DBLEND_ONE, D3DBLEND_ONE );
break;
}
}
}
else
{
delete m_pWeaponLine;
m_pWeaponLine = NULL;
m_bWeaponLine = false;
}
}
void CCreature::AddWeaponEffect(char *esfname,int effectnum)
{
if(m_lpChrModel != NULL) {
/// 무기의 처음과 끝을 알아낸다.
vector3 v1, v2;
vector3 v3;
// WEAPON 슬롯에 들어있는 무기 class Get
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
// 처음점, 끝점 얻어낸다. (v1,v2 어떤것이 위의 점인지는 알수 없당)
//상대좌표이다.
if(pWp == NULL) //무기 존재하지 않을때
return;
pWp->GetMarker( v1, v2 );
///
// 상대좌표이므로 실 좌표는 (무기좌표 + 캐릭터 좌표) 이다.
v1 += m_vecPos;
v2 += m_vecPos;
v3 = v2 - v1;
m_bWeaponEffect = true;
int i;
for( i=0; i<effectnum; i++) // Add Effect
{
float veclen = (i+1)/(float)effectnum;
vector3 lopv1 = v1;
lopv1 += v3 * veclen;
CWeaponEffect *node = NULL;
node = new CWeaponEffect;
// node setting
node->m_nWeaponEffectNum = effectnum;
node->m_nWeaponPosNum = i;
strcpy(node->m_strEffect,esfname);
node->m_pEffect = new CEffScript;
node->m_pEffect->GetScriptData(esfname);
//lopv1 == 이팩트 위치
node->m_pEffect->SetStartPos( lopv1.x, lopv1.y, lopv1.z );
node->m_pEffect->SetEndPos( lopv1.x, lopv1.y, lopv1.z );
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
node->m_pEffect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
CSceneManager::m_EffectManager.AddEffScript(node->m_pEffect);
m_WeaponEffect.push_back(node);
}
}
}
void CCreature::DeleteWeaponEffect() //전 weapon effect delete
{
int i;
for( i=0; i < m_WeaponEffect.size(); i++ )
{
delete m_WeaponEffect[i];
m_WeaponEffect[i] = NULL;
}
m_bWeaponEffect = false;
m_WeaponEffect.clear();
}
void CCreature::DeleteWeaponEffect(char *esfname,int iNum) //esfname을 가지는 effect delete
{
int i;
int iEffNum = iNum;
for( i = m_WeaponEffect.size() - 1; i >= 0; i-- )
{
if(m_WeaponEffect[i] != NULL) {
if( !CSceneManager::m_EffectManager.CheckNullScript(m_WeaponEffect[i]->m_pEffect) )
{
if( !strcmp(esfname,m_WeaponEffect[i]->m_strEffect) )
{
if(iEffNum) // 지우는 갯수 한도를 넘지 않는다
{
delete m_WeaponEffect[i];
m_WeaponEffect[i] = NULL;
m_WeaponEffect.erase(&(m_WeaponEffect[i]));
iEffNum--;
}
}
}
else
{
delete m_WeaponEffect[i];
m_WeaponEffect[i] = NULL;
m_WeaponEffect.erase(&(m_WeaponEffect[i]));
}
}
else {
m_WeaponEffect.erase(&(m_WeaponEffect[i]));
}
}
/*
for( i=0; i < m_WeaponEffect.size(); i++ )
{
if( !CSceneManager::m_EffectManager.CheckNullScript(m_WeaponEffect[i]->m_pEffect) )
{
if( !strcmp(esfname,m_WeaponEffect[i]->m_strEffect) )
{
delete m_WeaponEffect[i];
m_WeaponEffect[i] = NULL;
m_WeaponEffect.erase(&(m_WeaponEffect[i]));
}
}
else
{
delete m_WeaponEffect[i];
m_WeaponEffect[i] = NULL;
m_WeaponEffect.erase(&(m_WeaponEffect[i]));
}
}
*/
if(m_WeaponEffect.size() <= 0)
{
m_bWeaponEffect = false;
m_WeaponEffect.clear();
}
}
void CCreature::WeaponEffectUpdate()
{
int i;
if(m_bWeaponEffect) //등록된 Weapon Effect 가 있을때
{
if(m_lpChrModel) {
/// 무기의 처음과 끝을 알아낸다.
vector3 v1, v2;
vector3 v3;
// WEAPON 슬롯에 들어있는 무기 class Get
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
if(pWp == NULL) { //캐릭터가 무기 않들었을시에 weapon effect 전체 삭제
DeleteWeaponEffect();
return;
}
// 처음점, 끝점 얻어낸다. (v1,v2 어떤것이 위의 점인지는 알수 없당)
//상대좌표이다.
pWp->GetMarker( v1, v2 );
///
// 상대좌표이므로 실 좌표는 (무기좌표 + 캐릭터 좌표) 이다.
v1 += m_vecPos;
v2 += m_vecPos;
v3 = v2 - v1;
if( m_WeaponEffect.size() > 0 ) {
for( i=0; i < m_WeaponEffect.size(); i++ )
{
if(m_WeaponEffect[i] != NULL)
{
float veclen = (m_WeaponEffect[i]->m_nWeaponPosNum + 1) / (float)(m_WeaponEffect[i]->m_nWeaponEffectNum + 1);
vector3 lopv1 = v1;
lopv1 += v3 * veclen;
//lopv1이 Update 될 effect의 위치
// 6. 16일 Update
if(m_WeaponEffect[i]->m_pEffect != NULL && !(CSceneManager::m_EffectManager.CheckNullScript(m_WeaponEffect[i]->m_pEffect))){
m_WeaponEffect[i]->m_pEffect->SetStartPos(lopv1.x,lopv1.y,lopv1.z);
m_WeaponEffect[i]->m_pEffect->SetEndPos(lopv1.x,lopv1.y,lopv1.z);
float fChrDir = m_fDirection = m_lpChrModel->GetDirection();
fChrDir = -fChrDir;
fChrDir -= FLOAT_PHI / 2.0f;
vector3 vecChrToward;
vecChrToward.x = cosf(fChrDir);
vecChrToward.z = sinf(fChrDir);
vecChrToward.y = 0.0f;
vecChrToward.Normalize();
m_WeaponEffect[i]->m_pEffect->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
}
else
{
delete m_WeaponEffect[i];
m_WeaponEffect[i] = NULL;
m_WeaponEffect.erase(&(m_WeaponEffect[i]));
}
}
else
{
m_WeaponEffect.erase(&(m_WeaponEffect[i]));
}
} //for
} //if( m_WeaponEffect.size() > 0 )
else
{
m_WeaponEffect.clear();
m_bWeaponEffect = false;
}
}//if(m_lpChrModel)
else {
DeleteWeaponEffect();
}
}
}