/* * Copy one entity property from property of another entity. */ void CEntity::CopyOneProperty( CEntityProperty &epPropertySrc, CEntityProperty &epPropertyDest, CEntity &enOther, ULONG ulFlags) { // a helper macro #define COPYPROPERTY(flag) \ (flag &)ENTITYPROPERTY(this, epPropertyDest.ep_slOffset, flag) \ = (flag &)ENTITYPROPERTY(&enOther, epPropertySrc.ep_slOffset, flag) // depending on the property type switch (epPropertySrc.ep_eptType) { // if it is BOOL case CEntityProperty::EPT_BOOL: // copy BOOL COPYPROPERTY(INDEX); break; // if it is INDEX case CEntityProperty::EPT_INDEX: case CEntityProperty::EPT_ENUM: case CEntityProperty::EPT_FLAGS: case CEntityProperty::EPT_ANIMATION: case CEntityProperty::EPT_ILLUMINATIONTYPE: case CEntityProperty::EPT_COLOR: case CEntityProperty::EPT_ANGLE: // copy INDEX COPYPROPERTY(INDEX); break; // if it is FLOAT case CEntityProperty::EPT_FLOAT: case CEntityProperty::EPT_RANGE: // copy FLOAT COPYPROPERTY(FLOAT); break; // if it is STRING case CEntityProperty::EPT_STRING: case CEntityProperty::EPT_STRINGTRANS: // copy STRING COPYPROPERTY(CTString); break; // if it is FILENAME case CEntityProperty::EPT_FILENAME: // copy FILENAME COPYPROPERTY(CTFileName); break; // if it is FILENAMENODEP case CEntityProperty::EPT_FILENAMENODEP: // copy FILENAMENODEP COPYPROPERTY(CTFileNameNoDep); break; // if it is FLOATAABBOX3D case CEntityProperty::EPT_FLOATAABBOX3D: // copy FLOATAABBOX3D COPYPROPERTY(FLOATaabbox3D); break; // if it is FLOATMATRIX3D case CEntityProperty::EPT_FLOATMATRIX3D: // copy FLOATMATRIX3D COPYPROPERTY(FLOATmatrix3D); break; // if it is FLOAT3D case CEntityProperty::EPT_FLOAT3D: // copy FLOAT3D COPYPROPERTY(FLOAT3D); break; // if it is ANGLE3D case CEntityProperty::EPT_ANGLE3D: // copy ANGLE3D COPYPROPERTY(ANGLE3D); break; // if it is QUATERNION3D case CEntityProperty::EPT_FLOATQUAT3D: // copy ANGLE3D COPYPROPERTY(FLOATquat3D); break; // if it is FLOATplane3D case CEntityProperty::EPT_FLOATplane3D: // copy FLOATplane3D COPYPROPERTY(FLOATplane3D); break; // if it is ENTITYPTR case CEntityProperty::EPT_ENTITYPTR: // remap and copy the pointer if (ulFlags & COPY_REMAP) { ENTITYPROPERTY(this, epPropertyDest.ep_slOffset, CEntityPointer) = FindRemappedEntityPointer(ENTITYPROPERTY(&enOther, epPropertySrc.ep_slOffset, CEntityPointer)); // copy CEntityPointer } else { COPYPROPERTY(CEntityPointer); } break; // if it is MODELOBJECT case CEntityProperty::EPT_MODELOBJECT: // copy CModelObject ENTITYPROPERTY(this, epPropertyDest.ep_slOffset, CModelObject). Copy(ENTITYPROPERTY(&enOther, epPropertySrc.ep_slOffset, CModelObject)); // model objects are not copied, but should be initialized in Main() break; // if it is MODELINSTANCE case CEntityProperty::EPT_MODELINSTANCE: // copy CModelInstance ENTITYPROPERTY(this, epPropertyDest.ep_slOffset, CModelInstance). Copy(ENTITYPROPERTY(&enOther, epPropertySrc.ep_slOffset, CModelInstance)); // model objects are not copied, but should be initialized in Main() break; // if it is ANIMOBJECT case CEntityProperty::EPT_ANIMOBJECT: // copy CAnimObject ENTITYPROPERTY(this, epPropertyDest.ep_slOffset, CAnimObject). Copy(ENTITYPROPERTY(&enOther, epPropertySrc.ep_slOffset, CAnimObject)); break; // if it is SOUNDOBJECT case CEntityProperty::EPT_SOUNDOBJECT: { // copy CSoundObject CSoundObject &so = ENTITYPROPERTY(this, epPropertyDest.ep_slOffset, CSoundObject); so.Copy(ENTITYPROPERTY(&enOther, epPropertySrc.ep_slOffset, CSoundObject)); so.so_penEntity = this; } break; // if it is CPlacement3D case CEntityProperty::EPT_PLACEMENT3D: // copy CPlacement3D COPYPROPERTY(CPlacement3D); break; default: ASSERTALWAYS("Unknown property type"); } }
//------------------------------------------------------------------------------ // CUISelectResource::StartProduct // Explain: nSelectResource이 -1일 경우에는 Random으로 처리한다. // Date : 2005-08-30,Author: Lee Ki-hwan //------------------------------------------------------------------------------ void CUISelectResource::StartProduct( int nSelectResource ) { CUIManager* pUIManager = CUIManager::getSingleton(); // 생산시 보내는 메세지에 담을 데이터 저장 CTString strTemp; // BUG-FIX : ITS(#1727) 펫에 탑승시에는 수집/생산을 할 수 없다. [5/20/2011 rumist] if( _pNetwork->MyCharacterInfo.bWildPetRide || _pNetwork->MyCharacterInfo.bPetRide ) { if( m_iResourceType == 4 ) strTemp = _S( 5490, "펫에 탑승한 상태에서는 퀘스트 아이템을 수집할 수 없습니다." ); else strTemp = _S( 5491, "펫에 탑승한 상태에서는 생산할 수 없습니다." ); pUIManager->GetChattingUI()->AddSysMessage( strTemp, SYSMSG_ERROR ); return; } // BUG-FIX : 강신상태에서는 수집 / 채집 불가. [6/3/2011 rumist] CPlayerEntity* pPlayerEntity = (static_cast<CPlayerEntity*>(CEntity::GetPlayerEntity(0))); if( pPlayerEntity->IsTransforming()) { strTemp = _S( 5494, "강신 상태에서는 수집/채집/생산을 할 수 없습니다." ); pUIManager->GetChattingUI()->AddSysMessage( strTemp, SYSMSG_ERROR ); return; } // 선택 한 생산 종류에 따라서 에니메이션 시작 extern INDEX idPlayerWhole_Animation[ANIM_TOTAL]; switch(m_iResourceType) { case 1://채굴 { INDEX ani = idPlayerWhole_Animation[ANIM_MINE]; //INDEX ani = ska_StringToID(JobInfo().GetAnimationName( _pNetwork->MyCharacterInfo.job, ANIM_MINE )); CEntity::GetPlayerEntity(0)->AddAnimation(ani, AN_LOOPING|AN_CLEAR, 1.0f, 0x03, ESKA_MASTER_MODEL_INSTANCE, 1.0f); } break; case 2://채집 { INDEX ani = idPlayerWhole_Animation[ANIM_COLLECT]; //INDEX ani = ska_StringToID(JobInfo().GetAnimationName( _pNetwork->MyCharacterInfo.job, ANIM_GATHER )); CEntity::GetPlayerEntity(0)->AddAnimation(ani, AN_LOOPING|AN_CLEAR, 1.0f, 0x03, ESKA_MASTER_MODEL_INSTANCE, 1.0f); } break; case 3://차지 { INDEX ani = idPlayerWhole_Animation[ANIM_GATHER]; //INDEX ani = ska_StringToID(JobInfo().GetAnimationName( _pNetwork->MyCharacterInfo.job, ANIM_COLLECT )); CEntity::GetPlayerEntity(0)->AddAnimation(ani, AN_LOOPING|AN_CLEAR, 1.0f, 0x03, ESKA_MASTER_MODEL_INSTANCE, 1.0f); } break; case 4://수집 { INDEX ani = idPlayerWhole_Animation[ANIM_COLLECT]; //INDEX ani = ska_StringToID(JobInfo().GetAnimationName( _pNetwork->MyCharacterInfo.job, ANIM_GATHER )); CEntity::GetPlayerEntity(0)->AddAnimation(ani, AN_LOOPING|AN_CLEAR, 1.0f, 0x03, ESKA_MASTER_MODEL_INSTANCE, 1.0f); } break; } if( nSelectResource >= 0 ) { m_iProduceItemDBIndex = g_iProductItemDBIndex[m_iResourceType-1][nSelectResource]; strTemp = _pNetwork->GetItemData( g_iProductItemDBIndex[m_iResourceType-1][nSelectResource] )->GetName(); } else { m_iProduceItemDBIndex = -1; } CEntityProperty *pEP = CEntity::GetPlayerEntity(0)->PropertyForTypeAndID(CEntityProperty::EPT_INDEX, 239); if(pEP) { ENTITYPROPERTY( &*CEntity::GetPlayerEntity(0), pEP->ep_slOffset, INDEX) = m_iProduceItemDBIndex; } pEP = CEntity::GetPlayerEntity(0)->PropertyForTypeAndID(CEntityProperty::EPT_BOOL, 221); if(pEP) { ENTITYPROPERTY( &*CEntity::GetPlayerEntity(0), pEP->ep_slOffset, BOOL) = TRUE; } pEP = CEntity::GetPlayerEntity(0)->PropertyForTypeAndID(CEntityProperty::EPT_INDEX, 222); if(pEP) { ENTITYPROPERTY( &*CEntity::GetPlayerEntity(0), pEP->ep_slOffset, INDEX) = m_iResourceType; } // 현재 생산 중이 아이템을 화면에 표시 // 수집일경우 if(m_iResourceType == 4) strTemp += _S(3053, "퀘스트 아이템 수집을 시작합니다." ); else strTemp += _S( 1824, "생산을 시작합니다." ); pUIManager->GetChattingUI()->AddSysMessage(strTemp, SYSMSG_NORMAL); }
// ---------------------------------------------------------------------------- // Name : OpenSelectResource() // Desc : iType = 1 채굴, iType = 2 채집, iType = 3 차지 // ---------------------------------------------------------------------------- void CUISelectResource::OpenSelectResource( int npcIndex, int iType ) { if(iType == -1) return; if( IsVisible() ) { ResetSelectResource(); OpenSelectResource(npcIndex, iType); return; } CEntityProperty *pEP = CEntity::GetPlayerEntity(0)->PropertyForTypeAndID(CEntityProperty::EPT_BOOL, 221); if(pEP) { ENTITYPROPERTY( &*CEntity::GetPlayerEntity(0), pEP->ep_slOffset, BOOL) = FALSE; } pEP = CEntity::GetPlayerEntity(0)->PropertyForTypeAndID(CEntityProperty::EPT_INDEX, 222); if(pEP) { ENTITYPROPERTY( &*CEntity::GetPlayerEntity(0), pEP->ep_slOffset, INDEX) = -1; } ResetSelectResource(); m_iResourceType = iType; m_iClientNPCIndex = npcIndex; if(iType == 4 ) //수집이면 패스 { StartProduct(); ResetSelectResource(); } else { FLOAT fTexWidth = m_ptdBaseTexture->GetPixWidth(); FLOAT fTexHeight = m_ptdBaseTexture->GetPixHeight(); CUIButton TempUIButton; TempUIButton.SetUV( UBS_IDLE, 0, 117, 131, 138, fTexWidth, fTexHeight ); TempUIButton.SetUV( UBS_CLICK, 0, 140, 131, 161, fTexWidth, fTexHeight ); TempUIButton.CopyUV( UBS_IDLE, UBS_ON ); TempUIButton.CopyUV( UBS_IDLE, UBS_DISABLE ); const int iStartX = 20; const int iStartY = 30; int iCurPosX = iStartX; int iCurPosY = iStartY; CTString strName; for(INDEX i=0; i<2; ++i) { strName = i?_S( 1972, "선택 생산" ):_S( 1973, "무작위 생산" ); TempUIButton.Create(this, strName, iCurPosX, iCurPosY, BUTTON_WIDTH, BUTTON_HEIGHT ); m_vectorResourceList.push_back(TempUIButton); iCurPosY += BUTTON_HEIGHT + BUTTON_SPAN; } int nHeight = m_vectorResourceList.size() * (BUTTON_HEIGHT + BUTTON_SPAN) + TITLEBAR_HEIGHT + 10; SetSize( m_nWidth, nHeight ); CUIManager::getSingleton()->RearrangeOrder( UI_SELECTRESOURCE, TRUE ); } // 시작 되면 키보드 이동 막기 [3/26/2013 Ranma] m_bKeyMove = false; return; }
CTString GetPropertyValue(CEntity *pen, CEntityProperty *pepProperty, INDEX &iFormat) { CTString strResult=""; iFormat=PDF_STRING; // see type of changing property switch( pepProperty->ep_eptType) { case CEntityProperty::EPT_FLAGS: { strResult.PrintF("0x%08x", ENTITYPROPERTY( pen, pepProperty->ep_slOffset, ULONG)); break; } case CEntityProperty::EPT_ENUM: { // obtain enum property description object CEntityPropertyEnumType *epEnum = pepProperty->ep_pepetEnumType; INDEX iEnum = ENTITYPROPERTY( pen, pepProperty->ep_slOffset, INDEX); // search for selected enum BOOL bEnumFound=FALSE; for(INDEX iEnumItem=0; iEnumItem<epEnum->epet_ctValues; iEnumItem++) { if(iEnum==epEnum->epet_aepevValues[ iEnumItem].epev_iValue) { strResult=epEnum->epet_aepevValues[ iEnumItem].epev_strName; bEnumFound=TRUE; } } if( !bEnumFound) { strResult="Invalid enum value!!!"; } break; } case CEntityProperty::EPT_ANIMATION: { iFormat=PDF_INDEX; INDEX iAnim = ENTITYPROPERTY( pen, pepProperty->ep_slOffset, INDEX); CAnimData *pAD = pen->GetAnimData( pepProperty->ep_slOffset); if( pAD != NULL) { CAnimInfo aiInfo; pAD->GetAnimInfo(iAnim, aiInfo); strResult=aiInfo.ai_AnimName; } break; } case CEntityProperty::EPT_ENTITYPTR: case CEntityProperty::EPT_PARENT: { CEntity *penPtr = ENTITYPROPERTY( pen, pepProperty->ep_slOffset, CEntityPointer); if( penPtr!=NULL) { strResult="->"+penPtr->GetName(); } else { strResult="No target"; } break; } case CEntityProperty::EPT_FLOAT: case CEntityProperty::EPT_RANGE: case CEntityProperty::EPT_ANGLE: { iFormat=PDF_FLOAT; strResult.PrintF("%g", ENTITYPROPERTY( pen, pepProperty->ep_slOffset, FLOAT)); break; } case CEntityProperty::EPT_ILLUMINATIONTYPE: { INDEX iIllumination = ENTITYPROPERTY( pen, pepProperty->ep_slOffset, INDEX); strResult=pen->en_pwoWorld->wo_aitIlluminationTypes[iIllumination].it_strName; break; } case CEntityProperty::EPT_STRING: case CEntityProperty::EPT_STRINGTRANS: { strResult=ENTITYPROPERTY( pen, pepProperty->ep_slOffset, CTString); break; } case CEntityProperty::EPT_FLOATAABBOX3D: { FLOATaabbox3D box=ENTITYPROPERTY( pen, pepProperty->ep_slOffset, FLOATaabbox3D); strResult.PrintF("(%g,%g,%g)-(%g,%g,%g)", box.Min()(1),box.Min()(2),box.Min()(3), box.Max()(1),box.Max()(2),box.Max()(3)); break; } case CEntityProperty::EPT_ANGLE3D: { ANGLE3D ang=ENTITYPROPERTY( pen, pepProperty->ep_slOffset, ANGLE3D); strResult.PrintF("%g,%g,%g",ang(1),ang(2),ang(3)); break; } case CEntityProperty::EPT_INDEX: { iFormat=PDF_INDEX; strResult.PrintF("%d", ENTITYPROPERTY( pen, pepProperty->ep_slOffset, INDEX)); break; } case CEntityProperty::EPT_BOOL: { if(ENTITYPROPERTY( pen, pepProperty->ep_slOffset, BOOL)) { strResult="Yes"; } else { strResult="No"; } break; } case CEntityProperty::EPT_COLOR: { iFormat=PDF_COLOR; COLOR col=ENTITYPROPERTY( pen, pepProperty->ep_slOffset, COLOR); UBYTE ubR, ubG, ubB; UBYTE ubH, ubS, ubV; ColorToHSV( col, ubH, ubS, ubV); ColorToRGB( col, ubR, ubG, ubB); UBYTE ubA = (UBYTE) (col&255); strResult.PrintF( "RGB=(%d,%d,%d) HSV=(%d,%d,%d) Alpha=%d", ubR, ubG, ubB, ubH, ubS, ubV, ubA); break; } case CEntityProperty::EPT_FILENAME: { strResult = ENTITYPROPERTY( pen, pepProperty->ep_slOffset, CTFileName); break; } case CEntityProperty::EPT_FILENAMENODEP: { strResult = ENTITYPROPERTY( pen, pepProperty->ep_slOffset, CTFileNameNoDep); break; } default: { } } return strResult; }