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>
2967 lines
70 KiB
C++
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)
|
||
{
|
||
/// <20><><EFBFBD>⼭ <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> Ʋ<><C6B2><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||
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) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
{
|
||
m_bUpperAble = TRUE;
|
||
m_bLowerAble = TRUE;
|
||
m_bUpperAnimating = FALSE;
|
||
m_bLowerAnimating = FALSE;
|
||
|
||
if(KeyPressed('S') && (m_wClass == 2 || m_wClass == 7 || m_wClass == 20)) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
{
|
||
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) // <20>뽬 <20><><EFBFBD><EFBFBD>
|
||
{
|
||
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) // <20>뽬 <20><><EFBFBD><EFBFBD>
|
||
{
|
||
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)) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD>
|
||
{
|
||
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)) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD>
|
||
{
|
||
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); // <20><><EFBFBD>ǽ<EFBFBD>Ʈ <20>˾Ƴ<CBBE><C6B3><EFBFBD>
|
||
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); // <20><><EFBFBD>ǽ<EFBFBD>Ʈ <20>˾Ƴ<CBBE><C6B3><EFBFBD>
|
||
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 // Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><> ó<><C3B3>
|
||
{
|
||
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() {
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȭ<><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||
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) { // ȭ<>찹<EFBFBD><ECB0B9> <20><><EFBFBD><EFBFBD>
|
||
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<6C><64> slide <20>۵<EFBFBD> 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 <20><><EFBFBD><EFBFBD> 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 : <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
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 <20><> NULL <20>϶<EFBFBD> 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)) {
|
||
// <20>̹<EFBFBD><CCB9><EFBFBD> <20>̲<EFBFBD><CCB2><EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD>̿<EFBFBD> effect <20><><EFBFBD><EFBFBD>
|
||
|
||
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<69><64> 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();
|
||
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD> body effect list<73>ȿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD> <20>˻<EFBFBD>
|
||
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<65><78> effect <20><><EFBFBD><EFBFBD>
|
||
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)) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> effect <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>.
|
||
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 <20>ϳ<EFBFBD><CFB3><EFBFBD> effect <20><><EFBFBD><EFBFBD>
|
||
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)) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> effect <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>.
|
||
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 <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> num <20><><EFBFBD><EFBFBD> <20><>ŭ effect <20><><EFBFBD><EFBFBD> (num <20><><EFBFBD><EFBFBD> -1<≯<EFBFBD> <20><> pivot <20><> <20><> <20><><EFBFBD><EFBFBD>)
|
||
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)) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> effect <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>.
|
||
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) { // <20><> pivot<6F><74> effect <20><><EFBFBD><EFBFBD>
|
||
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;
|
||
}
|
||
|
||
}
|
||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD> effect <20><><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>
|
||
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)) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> effect <20><> <20>ִٸ<D6B4> <20>̹<EFBFBD><CCB9><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||
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);
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
tmp_node->m_Effect->SetMine(mine);
|
||
|
||
tmp_node->m_Effect->SetChant(true);
|
||
|
||
//////////////// Monster Effect
|
||
// ij<><C4B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
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 <20><><EFBFBD><EFBFBD>)
|
||
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() { // <20><><EFBFBD>߿<EFBFBD> character<65><72> effect <20><><EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
|
||
// GCMDS <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>ٴ<EFBFBD> effect filename<6D><65> pivot <20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD>
|
||
/* 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 <20><> eff <20><> <20>̿<EFBFBD><CCBF>ϴ<EFBFBD> <20>͵<EFBFBD>.
|
||
//unitsize : <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
|
||
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 <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> class Get
|
||
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
|
||
|
||
if(pWp == NULL) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
return;
|
||
|
||
CZ3DBladeTrail* pBladeTrail = pWp->GetBladeTrailInterface();
|
||
|
||
if( pBladeTrail )
|
||
{ // <20>ʱ<EFBFBD> <20>˱<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
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 <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> class Get
|
||
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
|
||
|
||
if(pWp == NULL) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
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) {
|
||
|
||
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˾Ƴ<CBBE><C6B3><EFBFBD>.
|
||
|
||
vector3 v1, v2;
|
||
vector3 v3;
|
||
|
||
// WEAPON <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> class Get
|
||
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
|
||
// ó<><C3B3><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB3BD>. (v1,v2 <20><EFBFBD><EEB6B2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˼<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>̴<EFBFBD>.
|
||
|
||
if(pWp == NULL) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
return;
|
||
|
||
pWp->GetMarker( v1, v2 );
|
||
|
||
///
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>̹Ƿ<CCB9> <20><> <20><>ǥ<EFBFBD><C7A5> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ + ij<><C4B3><EFBFBD><EFBFBD> <20><>ǥ) <20>̴<EFBFBD>.
|
||
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 == <20><><EFBFBD><EFBFBD>Ʈ <20><>ġ
|
||
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() //<2F><> 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<6D><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѵ<EFBFBD><D1B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>
|
||
{
|
||
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) //<2F><><EFBFBD>ϵ<EFBFBD> Weapon Effect <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
if(m_lpChrModel) {
|
||
|
||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˾Ƴ<CBBE><C6B3><EFBFBD>.
|
||
|
||
vector3 v1, v2;
|
||
vector3 v3;
|
||
|
||
// WEAPON <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> class Get
|
||
CZ3DWeapon *pWp = m_lpChrModel->GetAttachmentObject( "WEAPON" );
|
||
|
||
if(pWp == NULL) { //ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> weapon effect <20><>ü <20><><EFBFBD><EFBFBD>
|
||
DeleteWeaponEffect();
|
||
return;
|
||
}
|
||
// ó<><C3B3><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB3BD>. (v1,v2 <20><EFBFBD><EEB6B2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˼<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>̴<EFBFBD>.
|
||
pWp->GetMarker( v1, v2 );
|
||
|
||
|
||
///
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD>̹Ƿ<CCB9> <20><> <20><>ǥ<EFBFBD><C7A5> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ + ij<><C4B3><EFBFBD><EFBFBD> <20><>ǥ) <20>̴<EFBFBD>.
|
||
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<76><31> Update <20><> effect<63><74> <20><>ġ
|
||
// 6. 16<31><36> 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();
|
||
}
|
||
}
|
||
}
|
||
|