#include "Stdafx.h" #include "DNGameServerScriptAPI.h" #include "DNGameServerManager.h" #include "DNRUDPGameServer.h" #include "DNUserSession.h" #include "DNGameRoom.h" #include "DnWorld.h" #include "DnWorldGrid.h" #include "DnWorldSector.h" #include "DnWorldProp.h" #include "DnWorldActProp.h" #include "DnWorldBrokenProp.h" #include "EtWorldEventControl.h" #include "EtWorldEventArea.h" #include "DNNpc.h" #include "DNGameDataManager.h" #include "TaskManager.h" #include "DnGameTask.h" #include "DnPlayerActor.h" #include "DnLuaAPIDefine.h" #include "DnMonsterActor.h" #include "DNReplaceString.h" #include "EtUIXML.h" #include "PerfCheck.h" #include "DnTriggerElement.h" #include "DnTriggerObject.h" #include "DnNPCActor.h" #include "DNLogConnection.h" #include "DnItemTask.h" #include "MAActorProp.h" #include "DnDLGameTask.h" #include "DNQuestManager.h" #include "DnWorldNpcProp.h" #include "DnPartyTask.h" #include "TimeSet.h" #include "DnStateBlow.h" #include "PvPGameMode.h" #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) #include "ReputationSystemRepository.h" #include "NpcReputationProcessor.h" #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) #include "DNAggroSystem.h" #include "DNFarmUserSession.h" #include "DNUserItem.h" #include "DnWorld.h" #include "DNScriptAPICommon.h" #include "DNMissionSystem.h" #include "DnWorldKeepOperationProp.h" #if defined(PRE_ADD_POSITIONHACK_POS_LOG) #include "DnPlayerSpeedHackChecker.h" #endif // #if defined(PRE_ADD_POSITIONHACK_POS_LOG) #if !defined(_FINAL_BUILD) extern CLog g_ScriptLog; #endif // #if !defined(_FINAL_BUILD) int CheckInvenForQuestReward(CDNUserBase* pUser, const TQuestReward& QuestReward, const bool bSelectedArray[]) { return DNScriptAPI::CheckInvenForQuestReward(pUser, QuestReward, bSelectedArray); } void DefAllAPIFunc(lua_State* pLuaState) { DefineLuaAPI(pLuaState); //-- npc & quest LUA_TINKER_DEF(pLuaState, api_npc_NextTalk); LUA_TINKER_DEF(pLuaState, api_npc_NextScript); LUA_TINKER_DEF(pLuaState, api_npc_SetParamString); LUA_TINKER_DEF(pLuaState, api_npc_SetParamInt); LUA_TINKER_DEF(pLuaState, api_log_AddLog); LUA_TINKER_DEF(pLuaState, api_log_UserLog); LUA_TINKER_DEF(pLuaState, api_quest_DumpQuest); LUA_TINKER_DEF(pLuaState, api_quest_AddHuntingQuest); LUA_TINKER_DEF(pLuaState, api_quest_AddQuest); LUA_TINKER_DEF(pLuaState, api_quest_UserHasQuest); LUA_TINKER_DEF(pLuaState, api_quest_CompleteQuest); LUA_TINKER_DEF(pLuaState, api_quest_MarkingCompleteQuest); LUA_TINKER_DEF(pLuaState, api_quest_IsMarkingCompleteQuest); LUA_TINKER_DEF(pLuaState, api_npc_GetNpcIndex); LUA_TINKER_DEF(pLuaState, api_quest_SetQuestStepAndJournalStep); LUA_TINKER_DEF(pLuaState, api_quest_SetQuestStep); LUA_TINKER_DEF(pLuaState, api_quest_GetQuestStep); LUA_TINKER_DEF(pLuaState, api_quest_SetJournalStep); LUA_TINKER_DEF(pLuaState, api_quest_GetJournalStep); LUA_TINKER_DEF(pLuaState, api_quest_SetQuestMemo); LUA_TINKER_DEF(pLuaState, api_quest_GetQuestMemo); LUA_TINKER_DEF(pLuaState, api_quest_SetCountingInfo); LUA_TINKER_DEF(pLuaState, api_quest_ClearCountingInfo); LUA_TINKER_DEF(pLuaState, api_quest_IsAllCompleteCounting); LUA_TINKER_DEF(pLuaState, api_user_CheckInvenForAddItem); LUA_TINKER_DEF(pLuaState, api_user_CheckInvenForAddItemList); LUA_TINKER_DEF(pLuaState, api_user_AddItem); LUA_TINKER_DEF(pLuaState, api_user_DelItem); LUA_TINKER_DEF(pLuaState, api_user_AllDelItem); LUA_TINKER_DEF(pLuaState, api_user_HasItem); LUA_TINKER_DEF(pLuaState, api_user_GetUserClassID); LUA_TINKER_DEF(pLuaState, api_user_GetUserJobID); LUA_TINKER_DEF(pLuaState, api_user_GetUserLevel); LUA_TINKER_DEF(pLuaState, api_user_GetUserInvenBlankCount); LUA_TINKER_DEF(pLuaState, api_quest_GetUserQuestInvenBlankCount); LUA_TINKER_DEF(pLuaState, api_user_AddExp); LUA_TINKER_DEF(pLuaState, api_user_AddCoin); LUA_TINKER_DEF(pLuaState, api_user_PlayCutScene); LUA_TINKER_DEF(pLuaState, api_ui_OpenWareHouse); LUA_TINKER_DEF(pLuaState, api_ui_OpenShop); LUA_TINKER_DEF(pLuaState, api_ui_OpenSkillShop); LUA_TINKER_DEF(pLuaState, api_ui_OpenMarket); LUA_TINKER_DEF(pLuaState, api_ui_OpenCompoundEmblem); LUA_TINKER_DEF(pLuaState, api_ui_OpenUpgradeJewel); LUA_TINKER_DEF(pLuaState, api_ui_OpenMailBox); LUA_TINKER_DEF(pLuaState, api_ui_OpenDisjointItem); LUA_TINKER_DEF(pLuaState, api_ui_OpenCompoundItem); LUA_TINKER_DEF(pLuaState, api_ui_OpenCompound2Item); LUA_TINKER_DEF(pLuaState, api_ui_OpenCashShop); LUA_TINKER_DEF(pLuaState, api_ui_OpenGuildMgrBox); LUA_TINKER_DEF(pLuaState, api_ui_OpenGacha_JP); LUA_TINKER_DEF(pLuaState, api_ui_OpenGiveNpcPresent); LUA_TINKER_DEF(pLuaState, api_ui_OpenFarmWareHouse); #if defined(PRE_ADD_OPEN_QUEST_TEXTURE_DIALOG) LUA_TINKER_DEF(pLuaState, api_ui_OpenTextureDialog); LUA_TINKER_DEF(pLuaState, api_ui_CloseTextureDialog); #endif LUA_TINKER_DEF(pLuaState, api_user_UserMessage); LUA_TINKER_DEF(pLuaState, api_quest_AddSymbolItem); LUA_TINKER_DEF(pLuaState, api_quest_DelSymbolItem); LUA_TINKER_DEF(pLuaState, api_quest_HasSymbolItem); LUA_TINKER_DEF(pLuaState, api_quest_CheckQuestInvenForAddItem); LUA_TINKER_DEF(pLuaState, api_quest_CheckQuestInvenForAddItemList); LUA_TINKER_DEF(pLuaState, api_quest_AddQuestItem); LUA_TINKER_DEF(pLuaState, api_quest_DelQuestItem); LUA_TINKER_DEF(pLuaState, api_quest_AllDelQuestItem); LUA_TINKER_DEF(pLuaState, api_quest_HasQuestItem); LUA_TINKER_DEF(pLuaState, api_ui_OpenGuildCreate); LUA_TINKER_DEF(pLuaState, api_ui_OpenQuestReward); LUA_TINKER_DEF(pLuaState, api_quest_RewardQuestUser); LUA_TINKER_DEF(pLuaState, api_user_GetPartymemberCount); LUA_TINKER_DEF(pLuaState, api_user_IsPartymember); LUA_TINKER_DEF(pLuaState, api_user_ChangeMap); LUA_TINKER_DEF(pLuaState, api_user_GetStageConstructionLevel); LUA_TINKER_DEF(pLuaState, api_user_GetMapIndex); LUA_TINKER_DEF(pLuaState, api_user_GetLastStageClearRank); LUA_TINKER_DEF(pLuaState, api_user_EnoughCoin); LUA_TINKER_DEF(pLuaState, api_user_GetCoin); LUA_TINKER_DEF(pLuaState, api_user_DelCoin); LUA_TINKER_DEF(pLuaState, api_user_IsMissionGained); LUA_TINKER_DEF(pLuaState, api_user_IsMissionAchieved); LUA_TINKER_DEF(pLuaState, api_user_HasItemWarehouse); LUA_TINKER_DEF(pLuaState, api_user_HasItemEquip); LUA_TINKER_DEF(pLuaState, api_guild_GetGuildMemberRole); LUA_TINKER_DEF(pLuaState, api_quest_IncQuestMemo); LUA_TINKER_DEF(pLuaState, api_quest_DecQuestMemo); LUA_TINKER_DEF(pLuaState, api_user_SetUserJobID); LUA_TINKER_DEF(pLuaState, api_user_IsJobInSameLine); LUA_TINKER_DEF(pLuaState, api_user_HasCashItem); LUA_TINKER_DEF(pLuaState, api_user_HasCashItemEquip); LUA_TINKER_DEF(pLuaState, api_quest_IncCounting); LUA_TINKER_DEF(pLuaState, api_quest_IsPlayingQuestMaximum); LUA_TINKER_DEF(pLuaState, api_quest_ForceCompleteQuest); LUA_TINKER_DEF(pLuaState, api_user_ChangePos); LUA_TINKER_DEF(pLuaState, api_ui_OpenUpgradeItem); LUA_TINKER_DEF(pLuaState, api_user_RequestEnterPVP); LUA_TINKER_DEF(pLuaState, api_npc_GetFavorPoint); LUA_TINKER_DEF(pLuaState, api_npc_GetMalicePoint); LUA_TINKER_DEF(pLuaState, api_npc_GetFavorPercent); LUA_TINKER_DEF(pLuaState, api_npc_GetMalicePercent); LUA_TINKER_DEF(pLuaState, api_npc_AddFavorPoint); LUA_TINKER_DEF(pLuaState, api_npc_AddMalicePoint); LUA_TINKER_DEF(pLuaState, api_npc_SendSelectedPresent); LUA_TINKER_DEF(pLuaState, api_npc_Rage); LUA_TINKER_DEF(pLuaState, api_npc_Disappoint); LUA_TINKER_DEF(pLuaState, api_user_ResetSkill); LUA_TINKER_DEF(pLuaState, api_user_SetSecondJobSkill); LUA_TINKER_DEF(pLuaState, api_user_ClearSecondJobSkill); LUA_TINKER_DEF(pLuaState, api_user_RepairItem); LUA_TINKER_DEF(pLuaState, api_ui_OpenExchangeEnchant); //-- Æ®¸®°Å LUA_TINKER_DEF(pLuaState, api_trigger_GetPartyCount); LUA_TINKER_DEF(pLuaState, api_trigger_GetPartyActor); LUA_TINKER_DEF(pLuaState, api_trigger_IsInsidePlayerToEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_SetActionToProp); LUA_TINKER_DEF(pLuaState, api_trigger_ShowDungeonClear); LUA_TINKER_DEF(pLuaState, api_trigger_SetPermitGate); LUA_TINKER_DEF(pLuaState, api_trigger_GetMonsterAreaLiveCount); LUA_TINKER_DEF(pLuaState, api_trigger_RebirthMonster); LUA_TINKER_DEF(pLuaState, api_trigger_GenerationMonster); LUA_TINKER_DEF(pLuaState, api_trigger_GenerationMonsterGroup); LUA_TINKER_DEF(pLuaState, api_trigger_CmdMoveMonster); LUA_TINKER_DEF(pLuaState, api_trigger_CmdRandMoveMonster); LUA_TINKER_DEF(pLuaState, api_trigger_CheckMonsterIsInsideArea); LUA_TINKER_DEF(pLuaState, api_trigger_CheckMonsterLessHP); LUA_TINKER_DEF(pLuaState, api_trigger_CheckInsideAreaMonsterLessHP); LUA_TINKER_DEF(pLuaState, api_trigger_GenerationNpc); LUA_TINKER_DEF(pLuaState, api_trigger_DestroyNpc); LUA_TINKER_DEF(pLuaState, api_trigger_SetGameSpeed); LUA_TINKER_DEF(pLuaState, api_trigger_ShowProp); LUA_TINKER_DEF(pLuaState, api_trigger_IsAllDieMonster); LUA_TINKER_DEF(pLuaState, api_trigger_GetLastAimPropHandle); LUA_TINKER_DEF(pLuaState, api_trigger_GetLastAimPropActor); LUA_TINKER_DEF(pLuaState, api_trigger_IsBrokenProp); LUA_TINKER_DEF(pLuaState, api_trigger_GetLastBrokenPropActor); LUA_TINKER_DEF(pLuaState, api_trigger_IsProp); LUA_TINKER_DEF(pLuaState, api_trigger_DestroyMonsterArea); LUA_TINKER_DEF(pLuaState, api_trigger_DestroyAllMonster); LUA_TINKER_DEF(pLuaState, api_trigger_SetMonsterAIState); LUA_TINKER_DEF(pLuaState, api_trigger_PlayCutSceneByTrigger); LUA_TINKER_DEF(pLuaState, api_trigger_GetGameTime); LUA_TINKER_DEF(pLuaState, api_trigger_Delay); LUA_TINKER_DEF(pLuaState, api_trigger_GetBattleModeCount); LUA_TINKER_DEF(pLuaState, api_trigger_GetActionToProp); LUA_TINKER_DEF(pLuaState, api_trigger_ChangeMapByTrigger); LUA_TINKER_DEF(pLuaState, api_trigger_GetTalkNpcClassID); LUA_TINKER_DEF(pLuaState, api_trigger_GetTalkNpcActor); LUA_TINKER_DEF(pLuaState, api_trigger_GetTalkNpcTargetActor); LUA_TINKER_DEF(pLuaState, api_trigger_EnableOperatorProp); LUA_TINKER_DEF(pLuaState, api_trigger_AllUserEnableOperatorProp); LUA_TINKER_DEF(pLuaState, api_trigger_SetActionToPropActor); LUA_TINKER_DEF(pLuaState, api_trigger_EnableTriggerElement); LUA_TINKER_DEF(pLuaState, api_trigger_SetActionToActor); LUA_TINKER_DEF(pLuaState, api_trigger_EnableOperatorNpc); LUA_TINKER_DEF(pLuaState, api_trigger_EnableTriggerObject); LUA_TINKER_DEF(pLuaState, api_trigger_EnableMonsterNoDamage); LUA_TINKER_DEF(pLuaState, api_trigger_WarpActor); LUA_TINKER_DEF(pLuaState, api_trigger_WarpActorFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_IsInsidePropToEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_ChangeTeamFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_GetUserLevelByTrigger); LUA_TINKER_DEF(pLuaState, api_trigger_IsDieActor); LUA_TINKER_DEF(pLuaState, api_trigger_GetMonsterActorFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_DropItemToEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_DropItemToActor); LUA_TINKER_DEF(pLuaState, api_trigger_SetForceAggroToMonsterArea); LUA_TINKER_DEF(pLuaState, api_trigger_SetForceAggroToProp); LUA_TINKER_DEF(pLuaState, api_trigger_ShowChatBalloonToMonsterArea); LUA_TINKER_DEF(pLuaState, api_trigger_ShowChatBalloonToActor); LUA_TINKER_DEF(pLuaState, api_trigger_ShowChatBalloonToProp); LUA_TINKER_DEF(pLuaState, api_trigger_HideChatBalloonToMonsterArea); LUA_TINKER_DEF(pLuaState, api_trigger_HideChatBalloonToProp); LUA_TINKER_DEF(pLuaState, api_trigger_ShowExposureInfo); LUA_TINKER_DEF(pLuaState, api_trigger_GenerationMonsterSet); LUA_TINKER_DEF(pLuaState, api_trigger_GenerationMonsterSetInEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_DLChangeRound); LUA_TINKER_DEF(pLuaState, api_trigger_DLGetRound); LUA_TINKER_DEF(pLuaState, api_trigger_DLGetTotalRound); LUA_TINKER_DEF(pLuaState, api_trigger_DLGetStartFloor); LUA_TINKER_DEF(pLuaState, api_trigger_DLRequestChallenge); LUA_TINKER_DEF(pLuaState, api_trigger_DLResponseChallenge); LUA_TINKER_DEF(pLuaState, api_trigger_DLSetStartRound); LUA_TINKER_DEF(pLuaState, api_trigger_EnableDungeonClearWarpQuestFlag); LUA_TINKER_DEF(pLuaState, api_trigger_IsEnableDungeonClearWarp); LUA_TINKER_DEF(pLuaState, api_trigger_IsExistNotAchieveMissionPartyActor); LUA_TINKER_DEF(pLuaState, api_trigger_GetChangeActionPlayerActor); LUA_TINKER_DEF(pLuaState, api_trigger_GetActionToPlayerActor); LUA_TINKER_DEF(pLuaState, api_trigger_EnablePropNoDamage); LUA_TINKER_DEF(pLuaState, api_trigger_GetTriggerEventSignalEventAreaHandle); LUA_TINKER_DEF(pLuaState, api_trigger_GetTriggerEventSignalActorHandle); LUA_TINKER_DEF(pLuaState, api_trigger_GetTriggerEventSignalEventID); LUA_TINKER_DEF(pLuaState, api_trigger_GetTriggerEventSignalTeam); LUA_TINKER_DEF(pLuaState, api_trigger_GetMonsterAreaTotalCount); LUA_TINKER_DEF(pLuaState, api_trigger_HoldPartyDice); LUA_TINKER_DEF(pLuaState, api_trigger_ReleasePartyDice); LUA_TINKER_DEF(pLuaState, api_trigger_UpdateNestTryCount); LUA_TINKER_DEF(pLuaState, api_trigger_UpdateUserNestTryCount); LUA_TINKER_DEF(pLuaState, api_trigger_GetMonsterClassID); LUA_TINKER_DEF(pLuaState, api_trigger_EnableDungeonClearWarpAlarm); LUA_TINKER_DEF(pLuaState, api_trigger_SetHPFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_SetHP); LUA_TINKER_DEF(pLuaState, api_trigger_AddHPAbsoluteFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_AddHPRatioFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_AddHPAbsolute); LUA_TINKER_DEF(pLuaState, api_trigger_AddHPRatio); LUA_TINKER_DEF(pLuaState, api_trigger_GetTeamFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_GetTeam); LUA_TINKER_DEF(pLuaState, api_trigger_EnableOperatorNpcFromPropNpc); LUA_TINKER_DEF(pLuaState, api_trigger_SetHPRatioFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_SetHPRatio); LUA_TINKER_DEF(pLuaState, api_trigger_IgnoreAggroFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_GetPropDurability); LUA_TINKER_DEF(pLuaState, api_trigger_LastAimPropActorMessage); LUA_TINKER_DEF(pLuaState, api_trigger_BuffFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_ActorBuffFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_NoDuplicateBuffFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_Start_DragonNest); LUA_TINKER_DEF(pLuaState, api_trigger_SetUsableRebirthCoin); LUA_TINKER_DEF(pLuaState, api_trigger_GetMonsterHPPercent_FromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_UseSkillFromEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_UseSkill); LUA_TINKER_DEF(pLuaState, api_trigger_NotUseManaSkill); LUA_TINKER_DEF(pLuaState, api_trigger_AllUser_AddVehicleItem); LUA_TINKER_DEF(pLuaState, api_trigger_PlayerNameShowBlindCaption); LUA_TINKER_DEF(pLuaState, api_trigger_InvenToEquip); LUA_TINKER_DEF(pLuaState, api_trigger_UnRideVehicle); LUA_TINKER_DEF(pLuaState, api_trigger_ChangeMyBGM); LUA_TINKER_DEF(pLuaState, api_trigger_FileTableBGMOff); LUA_TINKER_DEF(pLuaState, api_trigger_RadioMsg); LUA_TINKER_DEF(pLuaState, api_trigger_RadioImage); LUA_TINKER_DEF(pLuaState, api_trigger_GetPvPGameModePlayTime); LUA_TINKER_DEF(pLuaState, api_trigger_DropGroupItemToEventArea); LUA_TINKER_DEF(pLuaState, api_trigger_DropGroupItemToActor); LUA_TINKER_DEF(pLuaState, api_trigger_TargetActorShowNpc); LUA_TINKER_DEF(pLuaState, api_trigger_TargetActorShowProp); LUA_TINKER_DEF(pLuaState, api_trigger_TriggerVariableTable); LUA_TINKER_DEF(pLuaState, api_trigger_GetPvPGameMode); LUA_TINKER_DEF(pLuaState, api_trigger_CmdKeepOperationProp); LUA_TINKER_DEF(pLuaState, api_trigger_ActivateMission); LUA_TINKER_DEF(pLuaState, api_trigger_SetDungeonClearRound); LUA_TINKER_DEF(pLuaState, api_trigger_BreakIntoUserCheck); LUA_TINKER_DEF(pLuaState, api_trigger_DungeonStartTimeAttack); LUA_TINKER_DEF(pLuaState, api_trigger_DungeonCheckTimeAttack); LUA_TINKER_DEF(pLuaState, api_trigger_DungeonStopTimeAttack); LUA_TINKER_DEF(pLuaState, api_trigger_RequestDungeonFail); LUA_TINKER_DEF(pLuaState, api_trigger_Special_RebirthItem); LUA_TINKER_DEF(pLuaState, api_trigger_GameWarpDungeonClearToLeader); LUA_TINKER_DEF(pLuaState, api_trigger_console_WriteLine); LUA_TINKER_DEF(pLuaState, api_trigger_GetPartyCountbyRoom); LUA_TINKER_DEF(pLuaState, api_trigger_GetPartyActorbyRoom); LUA_TINKER_DEF(pLuaState, api_trigger_GetRacingStartTime); LUA_TINKER_DEF(pLuaState, api_trigger_GetRacingGoalTime); LUA_TINKER_DEF(pLuaState, api_trigger_GetCurrentWeather); LUA_TINKER_DEF(pLuaState, api_trigger_StartDungeonGateTime); LUA_TINKER_DEF(pLuaState, api_trigger_EndDungeonGateTime); LUA_TINKER_DEF(pLuaState, api_trigger_StageRemainClearCount); //½ºÅ×ÀÌÁöÀÇ ³²Àº Ŭ¸®¾î Ä«¿îÆ® LUA_TINKER_DEF(pLuaState, api_trigger_EnableRideVehicle); LUA_TINKER_DEF(pLuaState, api_trigger_AllMonsterUseSkill); LUA_TINKER_DEF(pLuaState, api_trigger_RequireTotalComboCount); LUA_TINKER_DEF(pLuaState, api_trigger_RequireTotalComboReset); LUA_TINKER_DEF(pLuaState, api_trigger_GetPartyInClassCount); LUA_TINKER_DEF(pLuaState, api_trigger_Set_AlteiaWorld); LUA_TINKER_DEF(pLuaState, api_tirgger_Set_UserHPSP); LUA_TINKER_DEF(pLuaState, api_trigger_Set_ItemUseCount); //rlkt_test LUA_TINKER_DEF(pLuaState, api_trigger_CheckJobChangeProcess); LUA_TINKER_DEF(pLuaState, api_ui_OpenJobChange); LUA_TINKER_DEF(pLuaState, api_trigger_Emergence_GetValue); LUA_TINKER_DEF(pLuaState, api_trigger_Emergence_Begin); LUA_TINKER_DEF(pLuaState, api_trigger_Emergence_CheckSelectedEvent); LUA_TINKER_DEF(pLuaState, api_trigger_CheckForceMoveComebackRoom); } // desc : Àκ¥Å丮ÀÇ Æ¯Á¤ ºó½½·Ô¿¡ ¾ÆÀÌÅÛÀ» ¼¼ÆÃ (P.S.> api_user_CheckInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __SetBlankInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], const TItem& Item, int iIndex) { DN_ASSERT(NULL != pTempInven, "Invalid!"); DN_ASSERT(0 != Item.nItemID, "Invalid!"); DN_ASSERT(0 < Item.wCount, "Invalid!"); DN_ASSERT(-1 < iIndex, "Invalid!"); if (pTempInven[iIndex].nItemID != 0) { return false; } pTempInven[iIndex].Set(Item.nItemID, Item.wCount, Item.bSoulbound, Item.cSealCount ); return true; } // desc : Àκ¥Å丮ÀÇ ºó½½·Ôµé¿¡ ¾ÆÀÌÅÛÀ» ƯÁ¤ °³¼ö¸¸Å­ ¼¼ÆÃ (P.S.> api_user_CheckInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __SetBlankInventorySlotCount(TInvenItemCnt pTempInven[INVENTORYMAX], const TItem& Item, int nOverlapCount, int nCount /* ä¿ï ½½·Ô°³¼ö */) { DN_ASSERT(NULL != pTempInven, "Invalid!"); DN_ASSERT(0 != Item.nItemID, "Invalid!"); DN_ASSERT(0 < Item.wCount, "Invalid!"); DN_ASSERT(0 < nOverlapCount, "Invalid!"); DN_ASSERT(0 < nCount, "Invalid!"); // !!! ÁÖÀÇ - º» ÇÔ¼ö È£Ãâ Àü¿¡ üũ°¡ È®½ÇÈ÷ µÇ¾úÀ½À» ÀüÁ¦ÇÏ°í ¼¼ÆÃÇÏ´Â ºÎºÐ¸¸ ¼öÇà int nBundle = Item.wCount / nOverlapCount; int nRemain = Item.wCount % nOverlapCount; for (int iIndex = 0 ; INVENTORYMAX > iIndex ; ++iIndex) { if (0 < nBundle) { if (pTempInven[iIndex].nItemID == 0) { pTempInven[iIndex].Set(Item.nItemID, nOverlapCount, Item.bSoulbound, Item.cSealCount ); --nBundle; continue; } } if (0 < nRemain) { if( CDNUserItem::bIsSameItem( &Item, &pTempInven[iIndex] ) && nOverlapCount >= pTempInven[iIndex].wCount + nRemain ) { pTempInven[iIndex].wCount += nRemain; nRemain = 0; continue; } } } if (0 < nBundle) { return false; } if (0 < nRemain) { for (int iIndex = 0 ; INVENTORYMAX > iIndex ; ++iIndex) { if (pTempInven[iIndex].nItemID == 0) { pTempInven[iIndex].Set( Item.nItemID, nRemain, Item.bSoulbound, Item.cSealCount ); nRemain = 0; break; } } } if (0 < nRemain) { return false; } return true; } // desc : Àκ¥Å丮ÀÇ Æ¯Á¤ ½½·Ô¿¡ ¾ÆÀÌÅÛÀ» Áßø ¼¼ÆÃ (P.S.> api_user_CheckInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __SetOverlapInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], const TItem& Item, int nOverlapCount, int iIndex) { DN_ASSERT(NULL != pTempInven, "Invalid!"); DN_ASSERT(0 != Item.nItemID, "Invalid!"); DN_ASSERT(0 < Item.wCount, "Invalid!"); DN_ASSERT(0 < nOverlapCount, "Invalid!"); DN_ASSERT(-1 < iIndex, "Invalid!"); if( CDNUserItem::bIsDifferentItem( &Item, &pTempInven[iIndex] ) || nOverlapCount < pTempInven[iIndex].wCount + Item.wCount ) { return false; } pTempInven[iIndex].wCount += Item.wCount; return true; } // desc : Àκ¥Å丮¿¡ ºó½½·ÔÀÌ ¸î °³³ª ÀÖ´ÂÁö °³¼ö ã±â (P.S.> api_user_CheckInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) int __FindBlankInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount) { DN_ASSERT(NULL != pTempInven, "Invalid!"); DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!"); for (int iIndex = 0 ; nTempInvenCount > iIndex ; ++iIndex) { if (pTempInven[iIndex].nItemID == 0) { return iIndex; } } return -1; } // desc : Àκ¥Å丮¿¡ ºó½½·Ô ã±â (P.S.> api_user_CheckInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) int __FindBlankInventorySlotCount(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount) { DN_ASSERT(NULL != pTempInven, "Invalid!"); DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!"); int nCount = 0; for (int iIndex = 0 ; nTempInvenCount > iIndex ; ++iIndex) { if (pTempInven[iIndex].nItemID == 0) { ++nCount; } } return nCount; } // desc : Àκ¥Å丮¿¡ ¼¿ ¼ö ÀÖ´Â ¾ÆÀÌÅÛ Áß ³²Àº °ø°£¿¡ wCount ³ÖÀ» ¼ö ÀÖ´Â Index ã±â (P.S.> api_user_CheckInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) int __FindOverlapInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount, const TItem& Item ) { DN_ASSERT(NULL != pTempInven, "Invalid!"); DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!"); if ((Item.nItemID <= 0) || (Item.wCount <= 0)) DN_RETURN(-1); TItemData *pItemData = NULL; for (int iIndex = 0 ; nTempInvenCount > iIndex ; ++iIndex) { if (pTempInven[iIndex].nItemID == 0) { // ºóÄ­ÀÌ¸é ÆÐ½º continue; } pItemData = g_pDataManager->GetItemData(pTempInven[iIndex].nItemID); if (!pItemData) continue; if (pItemData->nOverlapCount == 1) continue; // °ãÄ¡Áö ¾ÊÀ¸¸é ÆÐ½º if( CDNUserItem::bIsDifferentItem( &Item, &pTempInven[iIndex] ) ) continue; // °°Àº ¾ÆÀÌÅÛÀÌ ¾Æ´Ô if (pItemData->nOverlapCount >= pTempInven[iIndex].wCount + Item.wCount) { return iIndex; } } return -1; } // desc : Àκ¥Å丮¿¡ ¾ÆÀÌÅÛÀ» ³ÖÀ» ¼ö ÀÖ´Â °ø°£ÀÌ ÃæºÐÇÑÁö °Ë»ç (P.S.> api_user_CheckInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __IsValidSpaceInventorySlotAndSet(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount, const TItem& Item ) { DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!"); if ((Item.nItemID <= 0) || (Item.wCount <= 0)) DN_RETURN(false); TItemData *pItem = g_pDataManager->GetItemData(Item.nItemID); if (!pItem) return false; int nCount = 0; if (pItem->nOverlapCount == 1){ // °ãÄ¡Áö ¾Ê´Â ¾ÆÀÌÅÛ nCount = __FindBlankInventorySlotCount(pTempInven, nTempInvenCount); if (Item.wCount > nCount) { // ºó½½·ÔÀ̶û ºñ±³Çϱâ return false; } return(__SetBlankInventorySlotCount(pTempInven, Item, 1, nCount)); } else { // °ãÃÄÁö´Â ¾ÆÀÌÅÛ (Àκ¥¿¡ µ¿ÀÏ ¾ÆÀÌÅÛµéÀÌ ¸î°³¾¿ ³²¾ÆÀ־ ½Å°æ¾È¾²°í ±ò²ûÇÏ°Ô ³Ö´Â °æ¿ì¸¸ »ý°¢ÇÏÀð) if (pItem->nOverlapCount < Item.wCount){ // Çѹø¿¡ °ãÄ¡´Â ¾çº¸´Ù ¸¹À»°æ¿ì int nBundle = Item.wCount / pItem->nOverlapCount; if ((Item.wCount % pItem->nOverlapCount) > 0) nBundle++; nCount = __FindBlankInventorySlotCount(pTempInven, nTempInvenCount); if (nBundle > nCount) { // ¹­À½À̶û ºó½½·ÔÀ̶û ºñ±³Çϱâ return false; } return(__SetBlankInventorySlotCount(pTempInven, Item, pItem->nOverlapCount, nCount)); } else { int nBlank = __FindOverlapInventorySlot(pTempInven, nTempInvenCount, Item ); // ±âÁ¸ ¾ÆÀÌÅÛÁß¿¡ Çѹ濡 µé¾î°¥ ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö if (nBlank < 0){ nBlank = __FindBlankInventorySlot(pTempInven, nTempInvenCount); if (nBlank < 0) { return false; } return(__SetBlankInventorySlot(pTempInven, Item, nBlank)); } return(__SetOverlapInventorySlot(pTempInven, Item, pItem->nOverlapCount, nBlank)); } } return true; } // desc : Äù½ºÆ® Àκ¥Å丮ÀÇ Æ¯Á¤ ºó½½·Ô¿¡ ¾ÆÀÌÅÛÀ» ¼¼ÆÃ (P.S.> api_quest_CheckQuestInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __SetBlankQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount, int iIndex) { DN_ASSERT(NULL != pTempQuestInven, "Invalid!"); DN_ASSERT(0 != nItemID, "Invalid!"); DN_ASSERT(0 < wCount, "Invalid!"); DN_ASSERT(-1 < iIndex, "Invalid!"); if (pTempQuestInven[iIndex].nItemID != 0) { return false; } pTempQuestInven[iIndex].Set(nItemID, wCount); return true; } // desc : Äù½ºÆ® Àκ¥Å丮ÀÇ ºó½½·Ôµé¿¡ ¾ÆÀÌÅÛÀ» ƯÁ¤ °³¼ö¸¸Å­ ¼¼ÆÃ (P.S.> api_quest_CheckQuestInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __SetBlankQuestInventorySlotCount(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount, int nOverlapCount, int nCount /* ä¿ï ½½·Ô°³¼ö */) { DN_ASSERT(NULL != pTempQuestInven, "Invalid!"); DN_ASSERT(0 != nItemID, "Invalid!"); DN_ASSERT(0 < wCount, "Invalid!"); DN_ASSERT(0 < nOverlapCount, "Invalid!"); DN_ASSERT(0 < nCount, "Invalid!"); // !!! ÁÖÀÇ - º» ÇÔ¼ö È£Ãâ Àü¿¡ üũ°¡ È®½ÇÈ÷ µÇ¾úÀ½À» ÀüÁ¦ÇÏ°í ¼¼ÆÃÇÏ´Â ºÎºÐ¸¸ ¼öÇà int nBundle = wCount / nOverlapCount; int nRemain = wCount % nOverlapCount; for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) { if (0 < nBundle) { if (pTempQuestInven[iIndex].nItemID == 0) { pTempQuestInven[iIndex].Set(nItemID, nOverlapCount); --nBundle; continue; } } if (0 < nRemain) { if (pTempQuestInven[iIndex].nItemID == nItemID && nOverlapCount >= pTempQuestInven[iIndex].wCount + nRemain ) { pTempQuestInven[iIndex].wCount += nRemain; nRemain = 0; continue; } } } if (0 < nBundle) { return false; } if (0 < nRemain) { for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) { if (pTempQuestInven[iIndex].nItemID == 0) { pTempQuestInven[iIndex].Set(nItemID, nRemain); nRemain = 0; break; } } } if (0 < nRemain) { return false; } return true; } // desc : Äù½ºÆ® Àκ¥Å丮ÀÇ Æ¯Á¤ ½½·Ô¿¡ ¾ÆÀÌÅÛÀ» Áßø ¼¼ÆÃ (P.S.> api_quest_CheckQuestInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __SetOverlapQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount, int nOverlapCount, int iIndex) { DN_ASSERT(NULL != pTempQuestInven, "Invalid!"); DN_ASSERT(0 != nItemID, "Invalid!"); DN_ASSERT(0 < wCount, "Invalid!"); DN_ASSERT(0 < nOverlapCount, "Invalid!"); DN_ASSERT(-1 < iIndex, "Invalid!"); if (pTempQuestInven[iIndex].nItemID != nItemID || nOverlapCount < pTempQuestInven[iIndex].wCount + wCount ) { return false; } pTempQuestInven[iIndex].wCount += wCount; return true; } // desc : Äù½ºÆ® Àκ¥Å丮¿¡ ºó½½·ÔÀÌ ¸î °³³ª ÀÖ´ÂÁö °³¼ö ã±â (P.S.> api_quest_CheckQuestInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) int __FindBlankQuestInventorySlotCount(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX]) { DN_ASSERT(NULL != pTempQuestInven, "Invalid!"); int nCount = 0; for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) { if (pTempQuestInven[iIndex].nItemID == 0) { ++nCount; } } return nCount; } // desc : Äù½ºÆ® Àκ¥Å丮¿¡ ºó½½·Ô ã±â (P.S.> api_quest_CheckQuestInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) int __FindBlankQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX]) { DN_ASSERT(NULL != pTempQuestInven, "Invalid!"); for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) { if (pTempQuestInven[iIndex].nItemID == 0) { return iIndex; } } return -1; } // desc : Äù½ºÆ® Àκ¥Å丮¿¡ ¼¿ ¼ö ÀÖ´Â ¾ÆÀÌÅÛ Áß ³²Àº °ø°£¿¡ wCount ³ÖÀ» ¼ö ÀÖ´Â Index ã±â (P.S.> api_quest_CheckQuestInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) int __FindOverlapQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount) { DN_ASSERT(NULL != pTempQuestInven, "Invalid!"); if ((nItemID <= 0) || (wCount <= 0)) DN_RETURN(-1); bool boFlag = false; TItemData *pQuestItem = NULL; for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) { if (pTempQuestInven[iIndex].nItemID == 0) continue; // ºóÄ­ÀÌ¸é ÆÐ½º pQuestItem = g_pDataManager->GetItemData(pTempQuestInven[iIndex].nItemID); if (!pQuestItem) continue; if (pQuestItem->nOverlapCount == 1) continue; // °ãÄ¡Áö ¾ÊÀ¸¸é ÆÐ½º if (pTempQuestInven[iIndex].nItemID != nItemID) continue; // °°Àº ¾ÆÀÌÅÛÀÌ ¾Æ´Ï´Ù if (pQuestItem->nOverlapCount >= pTempQuestInven[iIndex].wCount + wCount){ return iIndex; } } return -1; } // desc : Äù½ºÆ® Àκ¥Å丮¿¡ ¾ÆÀÌÅÛÀ» ³ÖÀ» ¼ö ÀÖ´Â °ø°£ÀÌ ÃæºÐÇÑÁö °Ë»ç (P.S.> api_quest_CheckQuestInvenForAddItemList ¿¡¼­ »ç¿ëµÊ) bool __IsValidSpaceQuestInventorySlotAndSet(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount) { DN_ASSERT(NULL != pTempQuestInven, "Invalid!"); if ((nItemID <= 0) || (wCount <= 0)) DN_RETURN(false); TItemData *pItem = g_pDataManager->GetItemData(nItemID); if (!pItem) return false; int nCount = 0; if (pItem->nOverlapCount == 1){ // °ãÄ¡Áö ¾Ê´Â ¾ÆÀÌÅÛ nCount = __FindBlankQuestInventorySlotCount(pTempQuestInven); if (wCount > nCount) { // ºó½½·ÔÀ̶û ºñ±³Çϱâ return false; } return(__SetBlankQuestInventorySlotCount(pTempQuestInven, nItemID, wCount, 1, nCount)); } else { // °ãÄ¡´Â ¾ÆÀÌÅÛ int nRemain = 0, nBlank = 0, nBundle = 0; int nLocalCount = __FindBlankQuestInventorySlotCount(pTempQuestInven); // ºó ½½·Ô°³¼ö if (pItem->nOverlapCount >= wCount){ nRemain = wCount; } else { nBundle = wCount / pItem->nOverlapCount; nRemain = wCount % pItem->nOverlapCount; if (nBundle > nLocalCount) return false; // °ø°£ºÎÁ· } if (nRemain > 0){ nBlank = __FindOverlapQuestInventorySlot(pTempQuestInven, nItemID, nRemain); // Â¥Åõ¸®°¡ µé¾î°¥ °ø°£ÀÌ ÀÖ´ÂÁö if (nBlank < 0){ // Â¥Åõ¸® °ø°£Àº ¾ø´Ù if ((nBundle + 1) > nLocalCount) return false; // ÇÑÄ­ÀÇ ¿©À¯°¡ ´õ ÀÖ´ÂÁö... } } return(__SetBlankQuestInventorySlotCount(pTempQuestInven, nItemID, wCount, pItem->nOverlapCount, nLocalCount)); } return true; } void api_log_AddLog(CDNGameRoom *pRoom, const char* szLog) { DN_ASSERT(NULL != pRoom, "Invalid!"); DNScriptAPI::api_log_AddLog(szLog); } void api_log_UserLog(CDNGameRoom *pRoom, UINT nUserObjectID, const char* szLog) { DN_ASSERT(NULL != pRoom, "Invalid!"); #ifndef _FINAL_BUILD CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return; DNScriptAPI::api_log_UserLog(pUser, szLog); #endif // _FINAL_BUILD } void api_quest_DumpQuest(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); #ifndef _FINAL_BUILD CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return; DNScriptAPI::api_quest_DumpQuest(pUser); #endif // _FINAL_BUILD } void api_npc_NextTalk(CDNGameRoom *pRoom, UINT nUserSessionID, UINT nNpcObjectID , const char* szTalkIndex, const char* szTargetFile) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserSessionID); if ( !pUser ) return; DNScriptAPI::api_npc_NextTalk(pUser, nNpcObjectID, szTalkIndex, szTargetFile); } void api_npc_NextScript(CDNGameRoom *pRoom, UINT nUserSessionID, UINT nNpcObjectID, const char* szTalkIndex, const char* szTargetFile) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserSessionID); if ( !pUser ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pUser->GetGameRoom(), nNpcObjectID ); if( !hActor || !hActor->IsNpcActor() ) return; CDnNPCActor* pNpc = static_cast(hActor.GetPointer()); DNScriptAPI::api_npc_NextScript(pUser, pNpc, nNpcObjectID, szTalkIndex, szTargetFile); } int api_npc_SetParamString(CDNGameRoom *pRoom, UINT nUserObjectID, const char* szParamKey, int nParamID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_npc_SetParamString(pUser, szParamKey, nParamID); } int api_npc_SetParamInt(CDNGameRoom *pRoom, UINT nUserObjectID, const char* szParamKey, int nValue) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_npc_SetParamInt(pUser, szParamKey, nValue); } int api_quest_AddHuntingQuest(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, int nQuestStep, int nJournalStep, int nCountingSlot, int nCountingType, int nCountingIndex, int nTargetCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_AddHuntingQuest(pUser, nQuestID, nQuestStep, nJournalStep, nCountingSlot, nCountingType, nCountingIndex, nTargetCnt); } int api_quest_AddQuest(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, int nQuestType) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_AddQuest(pUser, nQuestID, nQuestType); } int api_quest_CompleteQuest(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, bool bDelPlayList) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_CompleteQuest(pUser, nQuestID, bDelPlayList); } int api_quest_MarkingCompleteQuest(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID) { // º¸»óÄù½ºÆ®ÀÇ ¸¶Å·À» api_quest_CompleteQuestÀ¸·Î ÅëÇÕÇϱâ À§ÇØ ´õÀÌ»ó ÀÌ API´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. return 1; } int api_quest_IsMarkingCompleteQuest(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_IsMarkingCompleteQuest(pUser, nQuestID); } int api_quest_UserHasQuest(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_UserHasQuest(pUser, nQuestID); } int api_quest_GetPlayingQuestCnt(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_GetPlayingQuestCnt(pUser); } int api_npc_GetNpcIndex(CDNGameRoom *pRoom, UINT nUserObjectID, UINT nNpcObjID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pUser->GetGameRoom(), nNpcObjID ); if( !hActor || !hActor->IsNpcActor() ) return -2; CDnNPCActor* pNpc = static_cast(hActor.GetPointer()); return DNScriptAPI::api_npc_GetNpcIndex(pNpc); } int api_quest_SetQuestStepAndJournalStep(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, short nQuestStep, int nJournalStep) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_SetQuestStepAndJournalStep(pUser, nQuestID, nQuestStep, nJournalStep); } int api_quest_SetQuestStep(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, short nQuestStep) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_SetQuestStep(pUser, nQuestID, nQuestStep); } int api_quest_GetQuestStep(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_GetQuestStep(pUser, nQuestID); } int api_quest_SetJournalStep(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, int nJournalStep) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_SetJournalStep(pUser, nQuestID, nJournalStep); } int api_quest_GetJournalStep(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_GetJournalStep(pUser, nQuestID); } int api_quest_SetQuestMemo(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, char nMemoIndex, int iVal) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_SetQuestMemo(pUser, nQuestID, nMemoIndex, iVal); } int api_quest_GetQuestMemo(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, char nMemoIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) { return -1; } return DNScriptAPI::api_quest_GetQuestMemo(pUser, nQuestID, nMemoIndex); } int api_quest_SetCountingInfo(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, int nSlot, int nCountingType, int nCountingIndex, int nTargetCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; #if defined(_CH) if (pUser->GetFCMState() != FCMSTATE_NONE){ pUser->SendQuestResult(ERROR_QUEST_FCM); return -1; } #endif return DNScriptAPI::api_quest_SetCountingInfo(pUser, nQuestID, nSlot, nCountingType, nCountingIndex, nTargetCnt); } int api_quest_ClearCountingInfo(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_ClearCountingInfo(pUser, nQuestID); } int api_quest_IsAllCompleteCounting(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_IsAllCompleteCounting(pUser, nQuestID); } int api_user_CheckInvenForAddItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_user_CheckInvenForAddItem(pUser, nItemIndex, nItemCnt); } int api_user_CheckInvenForAddItemList(CDNGameRoom *pRoom, UINT nUserObjectID, lua_tinker::table ItemTable) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_user_CheckInvenForAddItemList(pUser, ItemTable); } int api_user_AddItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; #if defined(_CH) if (pUser->GetFCMState() != FCMSTATE_NONE){ pUser->SendQuestResult(ERROR_QUEST_FCM); return -1; } #endif CDNUserItem* pUserItem = pUser->GetItem(); if ( !pUserItem ) return -2; TItem ResultItem; if( CDNUserItem::MakeItemStruct(nItemIndex,ResultItem) == false ) return -2; // ÀÏ´ÜÀº Àӽ÷Πºó°ø°£¸¸ È®ÀÎÇÑ´Ù. // Àκ¥¿¡ ºó°ø°£ÀÌ ¾øÀ¸¸é if ( !pUserItem->IsValidSpaceInventorySlot(nItemIndex, nItemCnt, ResultItem.bSoulbound, ResultItem.cSealCount, ResultItem.bEternity) ) { return -3; } bool bResult = pUserItem->AddInventoryByQuest(nItemIndex, nItemCnt, nQuestID, 0); // ¾ÆÀÌÅÛ¿¡ µû¶ó¼­ randomseed ¸¦ ¾î¶»°Ô ³ÖÀ»²«Áö °áÁ¤ÇØÁֽñæ! #if defined( PRE_ENABLE_QUESTCHATLOG ) if ( bResult ) { // Àӽ÷Π½ÇÁ¦·Î ÁÖÁø ¾Ê°í À¯Àú äÆÃâ¿¡¸¸ Âï¾îÁØ´Ù. std::wstring wszMsg; wszMsg = FormatW( L"¾ÆÀÌÅÛ Áö±Þ : id %d count : %d" , nItemIndex, nItemCnt ); pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); } else { // Àӽ÷Π½ÇÁ¦·Î ÁÖÁø ¾Ê°í À¯Àú äÆÃâ¿¡¸¸ Âï¾îÁØ´Ù. std::wstring wszMsg; wszMsg = FormatW( L"¾ÆÀÌÅÛ Áö±Þ ½ÇÆÐ : id %d count : %d" , nItemIndex, nItemCnt ); pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); } #endif // #if defined( PRE_ENABLE_QUESTCHATLOG ) return 1; } int api_user_DelItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_DelItem(pUser, nItemIndex, nItemCnt, nQuestID); } int api_user_AllDelItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_AllDelItem(pUser, nItemIndex); } int api_user_HasItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_HasItem(pUser, nItemIndex, nItemCnt); } int api_user_GetUserClassID(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_GetUserClassID(pUser); } int api_user_GetUserJobID(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_GetUserJobID(pUser); } int api_user_GetUserLevel(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_GetUserLevel(pUser); } int api_user_GetUserInvenBlankCount(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_GetUserInvenBlankCount(pUser); } int api_quest_GetUserQuestInvenBlankCount(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_GetUserQuestInvenBlankCount(pUser); } /* desc : À¯Àú¿¡°Ô °æÇèÄ¡¸¦ Ãß°¡ÇÑ´Ù. param : À¯ÀúÀ妽º, °æÇèÄ¡ return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, */ int api_user_AddExp(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, int nAddExp) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; #if defined(_CH) if (pUser->GetFCMState() != FCMSTATE_NONE){ pUser->SendQuestResult(ERROR_QUEST_FCM); return -1; } #endif DnActorHandle hActor = pUser->GetActorHandle(); if ( !hActor || !hActor->IsPlayerActor() ) return -1; CDnPlayerActor* pPlayerActor = static_cast(hActor.GetPointer()); TExpData ExpData; ExpData.set( (float)nAddExp ); pPlayerActor->CmdAddExperience( ExpData, DBDNWorldDef::CharacterExpChangeCode::Quest, nQuestID ); int nExp = pPlayerActor->GetExperience(); #ifndef _FINAL_BUILD std::wstring wszMsg; wszMsg = FormatW( L"°æÇèÄ¡Ãß°¡ : %d ÃÖÁ¾ : %d" , nAddExp, nExp); pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif return 1; } /* desc : À¯Àú¿¡°Ô µ·À» Ãß°¡ÇÑ´Ù. param : À¯ÀúÀ妽º, µ· return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, */ int api_user_AddCoin(CDNGameRoom *pRoom, UINT nUserObjectID, int nAddCoin, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; #if defined(_CH) if (pUser->GetFCMState() != FCMSTATE_NONE){ pUser->SendQuestResult(ERROR_QUEST_FCM); return -1; } #endif DnActorHandle hActor = pUser->GetActorHandle(); if ( !hActor || !hActor->IsPlayerActor() ) return -1; CDnPlayerActor* pPlayerActor = static_cast(hActor.GetPointer()); pPlayerActor->CmdAddCoin(nAddCoin, DBDNWorldDef::CoinChangeCode::QuestReward, nQuestID); #ifndef _FINAL_BUILD std::wstring wszMsg; wszMsg = FormatW( L"ÄÚÀÎÃß°¡ : %d ÃÖÁ¾ : %lld", nAddCoin, pUser->GetCoin()); pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif return 1; } int api_user_PlayCutScene(CDNGameRoom *pRoom, UINT nUserObjectID, UINT nNpcObjectID, int nCutSceneTableID, bool bIgnoreFadeIn) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_PlayCutScene(pUser, nNpcObjectID, nCutSceneTableID, bIgnoreFadeIn); } int api_ui_OpenWareHouse(CDNGameRoom *pRoom, UINT nUserObjectID, int iItemID/*=0*/ ) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenWareHouse(pUser,iItemID); } /* desc : À¯Àú¿¡°Ô »óÁ¡¸¦ ¿­¶ó°í ¾Ë¸°´Ù. param : À¯ÀúÀ妽º, »óÁ¡ ID return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, -2 ¸é ¼¥ÀÌ ¾øÀ½. 1ÀÌ¸é ¼º°ø */ int api_ui_OpenShop(CDNGameRoom *pRoom, UINT nUserObjectID, int nShopID, Shop::Type::eCode Type/*=Shop::Type::Normal*/ ) { DN_ASSERT(NULL != pRoom, "Invalid!"); #if defined (PRE_MOD_GAMESERVERSHOP) CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenShop(pUser, nShopID, Type); #else /* CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; std::wstring wszLog; wszLog = FormatW( L"¼¥¿­±â"); pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str()); TShopData *pShopData = g_pDataManager->GetShopData(nShopID); if ( !pShopData ) return -2; pUser->m_nShopID = nShopID; pUser->SendShopList(pShopData); pUser->SetCalledNpcResponse(true, false); // º¸Åë Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»´Â UI °³¼³ ¿äû ÀÌÈÄ ´ëÈ­·Î À̾îÁöÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯°¡ ¾Æ´Ñµ¥µµ º»ÀÇ¾Æ´Ï°Ô NPC ÀÀ´ä¿©ºÎ üũ¿¡ °É¸®°Ô µÇ¹Ç·Î ´ëÈ­ÇÑ °ÍÀ¸·Î ó¸®ÇØ ÁÜ return 1; */ return -2; #endif } /* desc : À¯Àú¿¡°Ô »óÁ¡¸¦ ¿­¶ó°í ¾Ë¸°´Ù. param : À¯ÀúÀ妽º, ½ºÅ³ »óÁ¡ ID return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, -2 ¸é ¼¥ÀÌ ¾øÀ½. 1ÀÌ¸é ¼º°ø */ int api_ui_OpenSkillShop(CDNGameRoom *pRoom, UINT nUserObjectID, int nSkillShopID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; #if defined (PRE_MOD_GAMESERVERSHOP) return DNScriptAPI::api_ui_OpenSkillShop(pUser); #else /* CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; std::wstring wszLog; wszLog = FormatW( L"½ºÅ³¼¥¿­±â"); pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str()); TSkillShopData *pShopData = g_pDataManager->GetSkillShopData(nSkillShopID); if ( !pShopData ) return -2; pUser->m_nShopID = nSkillShopID; pUser->SendSkillShopList(pShopData); pUser->SetCalledNpcResponse(true, false); // º¸Åë Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»´Â UI °³¼³ ¿äû ÀÌÈÄ ´ëÈ­·Î À̾îÁöÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯°¡ ¾Æ´Ñµ¥µµ º»ÀÇ¾Æ´Ï°Ô NPC ÀÀ´ä¿©ºÎ üũ¿¡ °É¸®°Ô µÇ¹Ç·Î ´ëÈ­ÇÑ °ÍÀ¸·Î ó¸®ÇØ ÁÜ return 1; */ return -2; #endif } /* desc : À¯Àú¿¡°Ô ¹«ÀλóÁ¡À» ¿­¶ó°í ¾Ë¸°´Ù. param : À¯ÀúÀ妽º return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, -2 ¸é ¼¥ÀÌ ¾øÀ½. 1ÀÌ¸é ¼º°ø */ int api_ui_OpenMarket(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); /* CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; #ifndef _FINAL_BUILD std::wstring wszLog; wszLog = FormatW( L"¹«ÀλóÁ¡ ¿­±â"); pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str()); #endif pUser->SetCalledNpcResponse(true, false); // º¸Åë Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»´Â UI °³¼³ ¿äû ÀÌÈÄ ´ëÈ­·Î À̾îÁöÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯°¡ ¾Æ´Ñµ¥µµ º»ÀÇ¾Æ´Ï°Ô NPC ÀÀ´ä¿©ºÎ üũ¿¡ °É¸®°Ô µÇ¹Ç·Î ´ëÈ­ÇÑ °ÍÀ¸·Î ó¸®ÇØ ÁÜ return pUser->QueryDefaultMarketList(); */ return -2; } int api_ui_OpenCompoundEmblem(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenCompoundEmblem(pUser); } int api_ui_OpenUpgradeJewel(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenUpgradeJewel(pUser); } int api_ui_OpenMailBox(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenMailBox(pUser); } /* desc : À¯Àú¿¡°Ô ³óÀåâ°í¸¦ ¿­¶ó°í ½ÃŲ´Ù. param : À¯ÀúÀ妽º return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, 1ÀÌ¸é ¼º°ø */ int api_ui_OpenFarmWareHouse(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; if( !pRoom->bIsFarmRoom() ) return -1; #ifndef _FINAL_BUILD std::wstring wszLog; wszLog = FormatW( L"³óÀåâ°í ¿­±â"); pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str()); #endif static_cast(pUser)->ClearFarmWareHouseItem(); pUser->SendOpenFarmWareHouse(); pUser->SetCalledNpcResponse(true, false); // º¸Åë Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»´Â UI °³¼³ ¿äû ÀÌÈÄ ´ëÈ­·Î À̾îÁöÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯°¡ ¾Æ´Ñµ¥µµ º»ÀÇ¾Æ´Ï°Ô NPC ÀÀ´ä¿©ºÎ üũ¿¡ °É¸®°Ô µÇ¹Ç·Î ´ëÈ­ÇÑ °ÍÀ¸·Î ó¸®ÇØ ÁÜ return 1; } int api_ui_OpenDisjointItem(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenDisjointItem(pUser); } int api_ui_OpenCompoundItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nCompoundShopID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenCompoundItem(pUser, nCompoundShopID); } int api_ui_OpenCompound2Item( CDNGameRoom *pRoom, UINT nUserObjectID, int nCompoundGroupID, int iItemID/*=0*/ ) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; #ifndef _FINAL_BUILD std::wstring wszLog; wszLog = FormatW( L"¾ÆÀÌÅÛ ÇÕ¼ºÃ¢ ¿­±â"); pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str()); #endif pUser->SendOpenCompound2Item(nCompoundGroupID, iItemID ); pUser->SetCalledNpcResponse(true, false); // º¸Åë Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»´Â UI °³¼³ ¿äû ÀÌÈÄ ´ëÈ­·Î À̾îÁöÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯°¡ ¾Æ´Ñµ¥µµ º»ÀÇ¾Æ´Ï°Ô NPC ÀÀ´ä¿©ºÎ üũ¿¡ °É¸®°Ô µÇ¹Ç·Î ´ëÈ­ÇÑ °ÍÀ¸·Î ó¸®ÇØ ÁÜ pUser->SetRemoteItemCompoundItemID( iItemID ); return 1; } int api_ui_OpenCashShop(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenCashShop(pUser); } int api_ui_OpenGuildMgrBox(CDNGameRoom *pRoom, UINT nUserObjectID, int nGuildMgrNo) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenGuildMgrBox(pUser, nGuildMgrNo); } int api_ui_OpenGacha_JP(CDNGameRoom *pRoom, UINT nUserObjectID, int nGachaShopID) { #ifdef PRE_ADD_GACHA_JAPAN CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_ui_OpenGacha_JP(pUser, nGachaShopID); #else // PRE_ADD_GACHA_JAPAN return -3; #endif // PRE_ADD_GACHA_JAPAN } int api_ui_OpenGiveNpcPresent( CDNGameRoom* pRoom, UINT nUserObjectID, int nNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession( nUserObjectID ); if( !pUser ) return -1; return DNScriptAPI::api_ui_OpenGiveNpcPresent(pUser, nNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_user_UserMessage(CDNGameRoom *pRoom, UINT nUserObjectID, int nType, int nBaseStringIdx, lua_tinker::table ParamTable) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_user_UserMessage(pUser, nType, nBaseStringIdx, ParamTable); } /* desc : ÇÁ¶øÀ» Ŭ¸¯ÇÑ À¯Àú¿¡´ë ÇÑ ¸Þ¼¼Áö¸¦ Ãâ·ÂÇÑ´Ù param : À¯Àú ÇÚµé, ½ºÆ®¸µID return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, -2 ŸÀÔÀÌ ¾øÀ½ -3 ¸Þ¼¼Áö°¡ ³Ê¹« ±è -4 ·ëÀÌ ¾øÀ½ */ int api_trigger_LastAimPropActorMessage( CDNGameRoom *pRoom, int nType, int nActorHandle, int nBaseStringIdx, lua_tinker::table ParamTable ) { if( !pRoom ) return -4; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return -1; std::vector ReplaceParamList; #if defined(_SERVER) &&defined(PRE_ADD_MULTILANGUAGE) MultiLanguage::SupportLanguage::eSupportLanguage eLangCode; CDNUserSession * pUser; for( DWORD itr = 0; itr < pRoom->GetUserCount(); ++itr ) { eLangCode = MultiLanguage::eDefaultLanguage; pUser = pRoom->GetUserData(itr); if(pUser == NULL) continue; eLangCode = pUser->m_eSelectedLanguage; WCHAR wszBaseString[512]; swprintf_s( wszBaseString, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nBaseStringIdx, eLangCode ), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, hActor->GetNameUIStringIndex(), eLangCode ) ); std::wstring wszString = std::wstring(wszBaseString); // ¸ÕÀú ÆÄ¶ó¹ÌÅÍ Å×ÀÌºí¿¡ °ªÀÌ ÀÖ´ÂÁö È®ÀÎ Çϰí lua_tinker::table t = ParamTable.get(1); const char* __szKey = t.get(1); // ÀÖÀ¸¸é if ( __szKey ) { for ( int i = 1 ; i <= ParamTable.getSize() ; i++ ) { lua_tinker::table pTable = ParamTable.get(i); char* szKey = pTable.get(1); int nValueType = pTable.get(2); int nValue = pTable.get(3); DNReplaceString::DynamicReplaceStringInfo param; ToWideString(szKey, param.szKey); param.cValueType = (char)nValueType; param.nValue = nValue; ReplaceParamList.push_back(param); } } g_ReplaceString.Relpace( wszString, ReplaceParamList, eLangCode ); if( wszString.size() > 256 ) return -3; switch(nType) { case CHATTYPE_NORMAL: case CHATTYPE_PARTY: case CHATTYPE_PRIVATE: case CHATTYPE_GUILD: case CHATTYPE_CHANNEL: case CHATTYPE_SYSTEM: break; default: return -2; } pUser->SendChat( (eChatType)nType, (int)wszString.size()*sizeof(WCHAR), L"", wszString.c_str() ); } #else //#if defined(_SERVER) &&defined(PRE_ADD_MULTILANGUAGE) WCHAR wszBaseString[512]; swprintf_s( wszBaseString, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nBaseStringIdx ), hActor->GetName() ); std::wstring wszString = std::wstring(wszBaseString); // ¸ÕÀú ÆÄ¶ó¹ÌÅÍ Å×ÀÌºí¿¡ °ªÀÌ ÀÖ´ÂÁö È®ÀÎ Çϰí lua_tinker::table t = ParamTable.get(1); const char* __szKey = t.get(1); // ÀÖÀ¸¸é if ( __szKey ) { for ( int i = 1 ; i <= ParamTable.getSize() ; i++ ) { lua_tinker::table pTable = ParamTable.get(i); char* szKey = pTable.get(1); int nValueType = pTable.get(2); int nValue = pTable.get(3); DNReplaceString::DynamicReplaceStringInfo param; ToWideString(szKey, param.szKey); param.cValueType = (char)nValueType; param.nValue = nValue; ReplaceParamList.push_back(param); } } g_ReplaceString.Relpace( wszString, ReplaceParamList ); if( wszString.size() > 256 ) return -3; switch(nType) { case CHATTYPE_NORMAL: case CHATTYPE_PARTY: case CHATTYPE_PRIVATE: case CHATTYPE_GUILD: case CHATTYPE_CHANNEL: case CHATTYPE_SYSTEM: break; default: return -2; } CDNUserSession * pUser; for( DWORD itr = 0; itr < pRoom->GetUserCount(); ++itr ) { pUser = pRoom->GetUserData(itr); if( pUser ) pUser->SendChat( (eChatType)nType, (int)wszString.size()*sizeof(WCHAR), L"", wszString.c_str() ); } #endif //#if defined(_SERVER) &&defined(PRE_ADD_MULTILANGUAGE) return 1; } int api_quest_AddSymbolItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemID, short wCount) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_AddSymbolItem(pUser, nItemID, wCount); } int api_quest_DelSymbolItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemID, short wCount) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_DelSymbolItem(pUser, nItemID, wCount); } int api_quest_HasSymbolItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_HasSymbolItem(pUser, nItemIndex, nItemCnt); } int api_quest_CheckQuestInvenForAddItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_quest_CheckQuestInvenForAddItem(pUser, nItemIndex, nItemCnt); } int api_quest_CheckQuestInvenForAddItemList(CDNGameRoom *pRoom, UINT nUserObjectID, lua_tinker::table ItemTable) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_quest_CheckQuestInvenForAddItemList(pUser, ItemTable); } int api_quest_AddQuestItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemID, short wCount, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_AddQuestItem(pUser, nItemID, wCount, nQuestID); } int api_quest_DelQuestItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemID, short wCount, int nQuestID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_DelQuestItem(pUser, nItemID, wCount, nQuestID); } int api_quest_AllDelQuestItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemID ) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_AllDelQuestItem(pUser, nItemID); } int api_quest_HasQuestItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_quest_HasQuestItem(pUser, nItemIndex, nItemCnt); } /* desc : À¯Àú¿¡°Ô ±æµå »ý¼ºÃ¢À» ¶ç¿ì¶ó°í ¾Ë¸°´Ù. param : À¯ÀúÀ妽º return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, 1ÀÌ¸é ¼º°ø */ int api_ui_OpenGuildCreate(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; // N/A return 1; } /* desc : À¯Àú¿¡°Ô Äù½ºÆ® º¸»óâÀ» ¶ç¿ì¶ó°í ¾Ë¸°´Ù. param : À¯ÀúÀ妽º, º¸»óÅ×À̺í bActivate °¡ true ¸é °í¸¦¼ö ÀÖ°í ÀÌ¸é ±×³É º¸´Â ¿ëµµ´Â false·Î ¾´´Ù. return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, 1ÀÌ¸é ¼º°ø */ int api_ui_OpenQuestReward(CDNGameRoom *pRoom, UINT nUserObjectID, int nRewardTableIndex, bool bActivate) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; pUser->SendOpenQuestReward(nRewardTableIndex, bActivate); pUser->SetCalledNpcResponse(true, false); // º¸Åë Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»´Â UI °³¼³ ¿äû ÀÌÈÄ ´ëÈ­·Î À̾îÁöÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯°¡ ¾Æ´Ñµ¥µµ º»ÀÇ¾Æ´Ï°Ô NPC ÀÀ´ä¿©ºÎ üũ¿¡ °É¸®°Ô µÇ¹Ç·Î ´ëÈ­ÇÑ °ÍÀ¸·Î ó¸®ÇØ ÁÜ return 1; } int api_quest_RewardQuestUser(CDNGameRoom *pRoom, UINT nUserObjectID, int nRewardTableIndex, int nQuestID, int nRewardCheck) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_quest_RewardQuestUser(pUser, nRewardTableIndex, nQuestID, nRewardCheck); } void api_user_ChangeMap(CDNGameRoom *pRoom, UINT nUserObjectID, int nMapIndex, int nGateNo) { DN_ASSERT(NULL != pRoom, "Invalid!"); if( !pRoom ) return; CDNUserSession *pUser = pRoom->GetUserSession(nUserObjectID); if( !pUser ) return; #if defined(_CH) if (pUser->GetFCMState() != FCMSTATE_NONE){ pUser->SendQuestResult(ERROR_QUEST_FCM); return; } #endif int nPermitCnt = g_pDataManager->GetMapPermitPartyCount(nMapIndex); if (nPermitCnt > 0 && nPermitCnt < (int)pRoom->GetUserCountWithoutGM()) return; CDnGameTask *pTask = (CDnGameTask *)pUser->GetGameRoom()->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pRoom->RequestChangeMapFromTrigger( nMapIndex, nGateNo ); } /* desc : ÇØ´ç À¯ÀúÀÇ ÆÄƼ¿ø¼ö¸¦ ¸®ÅÏÇÑ´Ù. param : À¯ÀúÀ妽º return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, ±×¿Ü´Â ÆÄƼ¿ø¼ö (ÁÖÀÇ !!!> ÆÄƼ¿¡ °¡ÀÔµÇÁö ¾ÊÀº »ç¿ëÀÚµµ 1 À» ¹Ýȯ) */ int api_user_GetPartymemberCount(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; CDNGameRoom* pGameRoom = pUser->GetGameRoom(); if ( !pGameRoom ) return -1; return pGameRoom->GetUserCount(); } /* desc : ÇØ´ç À¯Àú°¡ ÆÄƼ¿¡ °¡ÀÔµÈ »óÅÂÀÎÁö üũÇÑ´Ù. param : À¯ÀúÀ妽º return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, 0 => ÆÄƼ¿¡ °¡ÀÔ ¾ÊµÇ¾îÀÖÀ½, 1 => ÆÄƼ¿¡ °¡ÀÔ µÇ¾îÀÖÀ½ */ int api_user_IsPartymember(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; CDNGameRoom* pGameRoom = pUser->GetGameRoom(); if ( !pGameRoom ) return -1; if (0 != pGameRoom->GetPartyIndex()) { return 1; } // ÆÄƼ¿¡ °¡ÀÔÇÏÁö ¾ÊÀº »óÅÂÀ̸é 0 À» ¹Ýȯ return 0; } /* desc : ÇØ´ç À¯ÀúÀÇ ½ºÅ×ÀÌÁö ³­À̵µ¸¦ ±¸ÇÔ param : À¯ÀúÀ妽º return : 0 ~ 4 => ´øÀü ³­À̵µ (0:½¬¿ò / 1:º¸Åë / 2:¾î·Á¿ò / 3:¸¶½ºÅÍ : 4:¾îºñ½º), ±× ¿Ü´Â ½ÇÆÐ (±âº» -1) */ int api_user_GetStageConstructionLevel(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } CDNGameRoom* pGameRoom = pUser->GetGameRoom(); if ( !pGameRoom ) { return -1; } return pGameRoom->GetGameTask()->GetStageDifficulty(); } int api_user_GetMapIndex(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_user_GetMapIndex(pUser); } int api_user_GetLastStageClearRank(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_user_GetLastStageClearRank(pUser); } int api_user_EnoughCoin(CDNGameRoom *pRoom, UINT nUserObjectID, int nCoin ) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } DnActorHandle hActor = pUser->GetActorHandle(); if (!hActor || !hActor->IsPlayerActor() ) return -1; return DNScriptAPI::api_user_EnoughCoin(pUser, nCoin); } int api_user_GetCoin(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } DnActorHandle hActor = pUser->GetActorHandle(); if (!hActor || !hActor->IsPlayerActor() ) return -1; return DNScriptAPI::api_user_GetCoin(pUser); } /* desc : À¯Àú¿¡°Ô µ·À» °¨¼ÒÇÑ´Ù. param : À¯ÀúÀ妽º, µ· (0 Ãʰú) return : -1 => À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, 1 => ¼º°ø */ int api_user_DelCoin(CDNGameRoom *pRoom, UINT nUserObjectID, int nDelCoin) { DN_ASSERT(NULL != pRoom, "Invalid!"); DN_ASSERT(0 < nDelCoin, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) return -1; #if defined(_CH) if (pUser->GetFCMState() != FCMSTATE_NONE){ pUser->SendQuestResult(ERROR_QUEST_FCM); return -1; } #endif DnActorHandle hActor = pUser->GetActorHandle(); if ( !hActor || !hActor->IsPlayerActor() ) return -1; CDnPlayerActor* pPlayerActor = static_cast(hActor.GetPointer()); pPlayerActor->CmdAddCoin((-nDelCoin), DBDNWorldDef::CoinChangeCode::Use, 0); #ifndef _FINAL_BUILD std::wstring wszMsg; wszMsg = FormatW( L"ÄÚÀΰ¨¼Ò : %d ÃÖÁ¾ : %lld" ,nDelCoin , pUser->GetCoin()); pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str()); #endif return 1; } int api_user_IsMissionGained(CDNGameRoom *pRoom, UINT nUserObjectID, int nMissionIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); DN_ASSERT(CHECK_LIMIT(nMissionIndex, MISSIONMAX), "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) return -1; return DNScriptAPI::api_user_IsMissionGained(pUser, nMissionIndex); } int api_user_IsMissionAchieved(CDNGameRoom *pRoom, UINT nUserObjectID, int nMissionIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) return -1; return DNScriptAPI::api_user_IsMissionAchieved(pUser, nMissionIndex); } int api_user_HasItemWarehouse(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_user_HasItemWarehouse(pUser, nItemIndex, nItemCnt); } int api_user_HasItemEquip(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_user_HasItemEquip(pUser, nItemIndex); } int api_guild_GetGuildMemberRole(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) return -1; return DNScriptAPI::api_guild_GetGuildMemberRole(pUser); } int api_quest_IncQuestMemo(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, char nMemoIndex) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) { return LONG_MIN; } return DNScriptAPI::api_quest_IncQuestMemo(pUser, nQuestID, nMemoIndex); } int api_quest_DecQuestMemo(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, char nMemoIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) { return LONG_MAX; } return DNScriptAPI::api_quest_DecQuestMemo(pUser, nQuestID, nMemoIndex); } int api_user_SetUserJobID(CDNGameRoom *pRoom, UINT nUserObjectID, int nJobID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) { return -1; } return DNScriptAPI::api_user_SetUserJobID(pUser, nJobID); } int api_user_IsJobInSameLine(CDNGameRoom *pRoom, UINT nUserObjectID, int nBaseJobID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) { return -1; } return DNScriptAPI::api_user_IsJobInSameLine(pUser, nBaseJobID); } int api_user_HasCashItem(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex, int nItemCnt) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) { return -1; } return DNScriptAPI::api_user_HasCashItem(pUser, nItemIndex, nItemCnt); } int api_user_HasCashItemEquip(CDNGameRoom *pRoom, UINT nUserObjectID, int nItemIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) { return -1; } return DNScriptAPI::api_user_HasCashItemEquip(pUser, nItemIndex); } int api_quest_IncCounting(CDNGameRoom *pRoom, UINT nUserObjectID, int nCountingType, int nCountingIndex) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_quest_IncCounting(pUser, nCountingType, nCountingIndex); } int api_quest_IsPlayingQuestMaximum(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_quest_IsPlayingQuestMaximum(pUser); } int api_quest_ForceCompleteQuest(CDNGameRoom *pRoom, UINT nUserObjectID, int nQuestID, int nQuestCode, int bDoMark, int bDoDelete, int bDoRepeat) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } return DNScriptAPI::api_quest_ForceCompleteQuest(pUser, nQuestID, nQuestCode, bDoMark, bDoDelete, bDoRepeat); } /* desc : ƯÁ¤ »ç¿ëÀÚÀÇ À§Ä¡¸¦ À̵¿ ½ÃŲ´Ù. param : À¯ÀúÀ妽º, X ÁÂÇ¥, Y ÁÂÇ¥, Z ÁÂÇ¥ return : -1 : À¯Àú¸¦ ãÀ»¼ö ¾øÀ½, 1 ¼º°ø */ int api_user_ChangePos(CDNGameRoom *pRoom, UINT nUserObjectID, int nX, int nY, int nZ, int nLookX, int nLookY) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } #if defined(_CH) if (pUser->GetFCMState() != FCMSTATE_NONE){ pUser->SendQuestResult(ERROR_QUEST_FCM); return -1; } #endif #ifndef _FINAL_BUILD wstring wszString = FormatW(L"¸¶À»¿¡¼­¸¸ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù.\r\n"); pUser->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() ); #endif // _FINAL_BUILD return 1; } int api_ui_OpenUpgradeItem(CDNGameRoom *pRoom, UINT nUserObjectID, int iItemID/*=0*/ ) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } pUser->SendOpenUpgradeItem( iItemID ); pUser->SetCalledNpcResponse(true, false); // º¸Åë Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»´Â UI °³¼³ ¿äû ÀÌÈÄ ´ëÈ­·Î À̾îÁöÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯°¡ ¾Æ´Ñµ¥µµ º»ÀÇ¾Æ´Ï°Ô NPC ÀÀ´ä¿©ºÎ üũ¿¡ °É¸®°Ô µÇ¹Ç·Î ´ëÈ­ÇÑ °ÍÀ¸·Î ó¸®ÇØ ÁÜ pUser->SetRemoteEnchantItemID( iItemID ); return 1; } int api_user_RequestEnterPVP(CDNGameRoom *pRoom, UINT nUserObjectID) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } #ifndef _FINAL_BUILD wstring wszString = FormatW(L"¸¶À»¿¡¼­¸¸ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù.\r\n"); pUser->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() ); #endif // _FINAL_BUILD return 1; } int api_npc_GetFavorPoint( CDNGameRoom *pRoom, UINT uiUserObjectID, int iNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if (!pUser) return -1; return DNScriptAPI::api_npc_GetFavorPoint(pUser, iNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_GetMalicePoint( CDNGameRoom *pRoom, UINT uiUserObjectID, int iNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_GetMalicePoint(pUser, iNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_GetFavorPercent( CDNGameRoom *pRoom, UINT uiUserObjectID, int iNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_GetFavorPercent(pUser, iNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_GetMalicePercent( CDNGameRoom *pRoom, UINT uiUserObjectID, int iNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_GetMalicePercent(pUser, iNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_AddFavorPoint( CDNGameRoom *pRoom, UINT uiUserObjectID, int iNpcID, int val ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_AddFavorPoint(pUser, iNpcID, val); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_AddMalicePoint( CDNGameRoom *pRoom, UINT uiUserObjectID, int iNpcID, int val ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_AddMalicePoint(pUser, iNpcID, val); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_SendSelectedPresent( CDNGameRoom* pRoom, UINT uiUserObjectID, int iNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_SendSelectedPresent(pUser, iNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_Rage( CDNGameRoom* pRoom, UINT uiUserObjectID, int iNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_Rage(pUser, iNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_npc_Disappoint( CDNGameRoom* pRoom, UINT uiUserObjectID, int iNpcID ) { #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CDNUserSession* pUser = pRoom->GetUserSession(uiUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_npc_Disappoint(pUser, iNpcID); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_user_ResetSkill(CDNGameRoom *pRoom, UINT nUserObjectID) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) { return -1; } #ifndef _FINAL_BUILD wstring wszString = FormatW(L"¸¶À»¿¡¼­¸¸ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù.\r\n"); pUser->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() ); #endif // _FINAL_BUILD return 1; } int api_user_SetSecondJobSkill(CDNGameRoom *pRoom, UINT nUserObjectID, int iSecondChangeJobID) { CDNUserSession * pSession = pRoom->GetUserSession(nUserObjectID); if (!pSession) { return -1; } CDnPlayerActor* pPlayerActor = pSession->GetPlayerActor(); if( pPlayerActor ) { if( pPlayerActor->CanChangeJob( iSecondChangeJobID ) ) { // °¢ Á÷¾÷º°·Î µé¾î°¡´Â 2Â÷ ÀüÁ÷ ½ºÅ³µéÀÇ ID switch( iSecondChangeJobID ) { // ¼Òµå¸¶½ºÅÍ -> ±Û·¡µð¿¡ÀÌÅÍ case 23: { // Àӽà ½ºÅ³ Ãß°¡¿¡ ´ëÇØ¼­ Ŭ¶ó·Î ÆÐŶµµ º¸³¿.. pPlayerActor->AddTempSkill( 301 ); // À̺£ÀÌÁ¯ ½½·¡½¬ pPlayerActor->AddTempSkill( 302 ); // Æ®¸®Çà ½½·¡½¬ ex pPlayerActor->AddTempSkill( 303 ); // ÇǴϽ¬ ¾îÅà } break; // ¼Òµå¸¶½ºÅÍ -> ¿ö·Îµå case 24: { pPlayerActor->AddTempSkill( 351 ); // ¹® ºí·¹ÀÌµå ´í½º pPlayerActor->AddTempSkill( 352 ); // ¹®¶óÀÌÆ® ½ºÇø°ÅÍ ex pPlayerActor->AddTempSkill( 353 ); // Ç÷¡½¬ ½ºÅĽº } break; // ¸Ó¼Å³Ê¸® -> ¹Ù¹Ù¸®¾È case 25: { pPlayerActor->AddTempSkill( 501 ); // ¾îÆæµå È÷Æ® pPlayerActor->AddTempSkill( 502 ); // ½ºÅèÇÁ ex pPlayerActor->AddTempSkill( 503 ); // º» Å©·¡½¬ } break; // ¸Ó¼Å³Ê¸® -> µð½ºÆ®·ÎÀ̾î case 26: { pPlayerActor->AddTempSkill( 551 ); // ºê·¹ÀÌÅ· Æ÷ÀÎÆ® pPlayerActor->AddTempSkill( 552 ); // ÇöóÀ× ½ºÀ® ex pPlayerActor->AddTempSkill( 553 ); // ¸ÞÀϽºÆ®·Ò ÇÏ¿ï } break; // º¸¿ì¸¶½ºÅÍ -> ½º³ªÀÌÆÛ case 29: { pPlayerActor->AddTempSkill( 1301 ); // Å©¸®Æ¼Äà ºê·¹ÀÌÅ© pPlayerActor->AddTempSkill( 1302 ); // Â÷Áö¼¦ ex pPlayerActor->AddTempSkill( 1303 ); // Ä¡ÆÃ Æ÷ÀÎÆ® } break; // º¸¿ì¸¶½ºÅÍ -> ¾ÆÆ¿·¯¸® case 30: { pPlayerActor->AddTempSkill( 1351 ); // ¸ÅÁöÄà ºê¸®Áî pPlayerActor->AddTempSkill( 1352 ); // ÀͽºÅÙ¼Ç ¾Ö·Î¿ì ex pPlayerActor->AddTempSkill( 1353 ); // µ¥Åä³×ÀÌÆÃ ¾Ö·Î¿ì } break; // ¾ÆÅ©·Î¹î -> ÅÛÆä½ºÆ® case 31: { pPlayerActor->AddTempSkill( 1501 ); // À̺£À̵å pPlayerActor->AddTempSkill( 1502 ); // ű ¾Ø ¼¦ ex pPlayerActor->AddTempSkill( 1503 ); // Ç㸮ÄÉÀÎ ´í½º } break; // ¾ÆÅ©·Î¹î -> À©µå¿öÄ¿ case 32: { pPlayerActor->AddTempSkill( 1551 ); // ¼îŸÀÓ pPlayerActor->AddTempSkill( 1552 ); // ½ºÆÄÀÌ·² ű ex pPlayerActor->AddTempSkill( 1553 ); // ¶óÀÌ¡ ½ºÅè } break; // ¿¤¸®¸àÅ»·Îµå -> ¼¿·¹¾Æ³ª case 35: { pPlayerActor->AddTempSkill( 2301 ); // ÀͽºÇ÷ÎÀü pPlayerActor->AddTempSkill( 2302 ); // ÆÄÀ̾ ex pPlayerActor->AddTempSkill( 2303 ); // ·Ñ¸µ ¶ó¹Ù } break; // ¿¤¸®¸àÅ»·Îµå -> ¿¤·¹½ºÆ®¶ó case 36: { pPlayerActor->AddTempSkill( 2351 ); // ¾ÆÀ̽º ¹è¸®¾î pPlayerActor->AddTempSkill( 2352 ); // ¾ÆÀ̽º ¼Òµå ex pPlayerActor->AddTempSkill( 2353 ); // ¾ÆÀ̽ÃŬ ÀÎÁ§¼Ç } break; // Æ÷½ºÀ¯Àú -> ½º¸Å¼Å case 37: { pPlayerActor->AddTempSkill( 2501 ); // ¾ÆÄÉÀÎ pPlayerActor->AddTempSkill( 2502 ); // ¸®´Ï¾î ·¹ÀÌ ex pPlayerActor->AddTempSkill( 2503 ); // ¿ÀºñƲ ·¹ÀÌÀú } break; // Æ÷½ºÀ¯Àú -> ¸¶Á¦½ºÆ¼ case 38: { pPlayerActor->AddTempSkill( 2551 ); // ½ºÆ¿ ¸ÅÁ÷ pPlayerActor->AddTempSkill( 2552 ); // ±×¶óºñƼº¼ ex pPlayerActor->AddTempSkill( 2553 ); // ½ºÀ§Ä¡ ±×¶óºñƼ } break; // ÆÈ¶óµò -> °¡µð¾ð case 41: { pPlayerActor->AddTempSkill( 3301 ); // ¿ÀÅä ºí·Ï ex pPlayerActor->AddTempSkill( 3302 ); // °¡µð¾ð Æ÷½º pPlayerActor->AddTempSkill( 3303 ); // Àú½ºÆ¼½º Å©·¡½¬ } break; // ÆÈ¶óµò -> Å©·ç¼¼ÀÌ´õ case 42: { pPlayerActor->AddTempSkill( 3351 ); // ÀúÁö½º ÆÄ¿ö pPlayerActor->AddTempSkill( 3352 ); // Ȧ¸® Å©·Î½º ex pPlayerActor->AddTempSkill( 3353 ); // ÀúÁö¸ÕÆ® ÇØ¸Ó } break; // ÇÁ¸®½ºÆ® -> ¼¼ÀÎÆ® case 43: { pPlayerActor->AddTempSkill( 3501 ); // Ȧ¸® ½¯µå pPlayerActor->AddTempSkill( 3502 ); // ·¼¸¯ ¿Àºê ¶óÀÌÆ®´× ex pPlayerActor->AddTempSkill( 3503 ); // ¼îÅ© ¿Àºê ·¼¸¯ } break; // ÇÁ¸®½ºÆ® -> ÀÎÄûÁöÅÍ case 44: { pPlayerActor->AddTempSkill( 3551 ); // ¼îÅ© Æ®·£Áö¼Ç pPlayerActor->AddTempSkill( 3552 ); // ¶óÀÌÆ®´× º¼Æ® ex pPlayerActor->AddTempSkill( 3553 ); // ÄÁ½ºÅ©·¹ÀÌ¼Ç } break; // ¿£Áö´Ï¾î -> ½´ÆÃ½ºÅ¸ case 47: { pPlayerActor->AddTempSkill( 4301 ); // ½ºÇ÷¡½¬ pPlayerActor->AddTempSkill( 4302 ); // ÇÎÆþ¹ã EX pPlayerActor->AddTempSkill( 4303 ); // ¾ËÇÁ·¹µµ ºö } break; // ¿£Áö´Ï¾î -> ±â¾î ¸¶½ºÅÍ case 48: { pPlayerActor->AddTempSkill( 4351 ); // üÀμҿì Ÿ¿ö pPlayerActor->AddTempSkill( 4352 ); // ¸ÞÄ«´ö EX pPlayerActor->AddTempSkill( 4353 ); // ºò ¸ÞÄ« ºÕ¹ö } break; // ¾ËÄɹ̽ºÆ® -> ¾îµªÆ® case 50: { pPlayerActor->AddTempSkill( 4501 ); // C2H5OH pPlayerActor->AddTempSkill( 4502 ); // ¸¶±×¸¶ ÆÝÄ¡ EX pPlayerActor->AddTempSkill( 4503 ); // ¾ÆÀ̽º ºö } break; // ¾ËÄɹ̽ºÆ® -> ÇÇÁö¼Ç case 51: { pPlayerActor->AddTempSkill( 4551 ); // ·¯ºê ¹ÙÀÌ·¯½º pPlayerActor->AddTempSkill( 4552 ); // ÀÎÁ§ÅÍ EX pPlayerActor->AddTempSkill( 4553 ); // Èú »þ¿ö } break; // ½ºÅ©¸®¸Ó -> ´ÙÅ©¼­¸Ó³Ê case 55: { pPlayerActor->AddTempSkill( 5301 ); // »õµðÁò Ç÷¹Àú pPlayerActor->AddTempSkill( 5302 ); // ÆÒÅÒ Å¬·Î EX pPlayerActor->AddTempSkill( 5303 ); // Ä«¿À½º Æ÷¸ÞÀÌ¼Ç } break; //½ºÅ©¸®¸Ó -> ¼Ò¿ïÀÌÅÍ case 56: { pPlayerActor->AddTempSkill( 5401 ); // ½ºÆåÅÍ ¿ÀÇÁ ÆäÀÎ pPlayerActor->AddTempSkill( 5402 ); // ½ºÇǸ´ ÆäÀÌÆÛ EX pPlayerActor->AddTempSkill( 5403 ); // ¼Ò¿ï ½ºÅ©¸² } break; //´í¼­ -> ºí·¹À̵å´í¼­ case 58: { pPlayerActor->AddTempSkill( 5501 ); // ½ºÄÝ Ç÷¹ÀÌÄ¿ pPlayerActor->AddTempSkill( 5505 ); // °Å½ºÆ® µð¸à½Ã¾Æ pPlayerActor->AddTempSkill( 5502 ); // ±×·¹ÀÌÁî ´í¼­ ex } break; //´í¼­ -> ½ºÇǸ´´í¼­ case 59: { pPlayerActor->AddTempSkill( 5601 ); // ¿ÍÀÌµå ½ºÆÃ¾î pPlayerActor->AddTempSkill( 5605 ); // ÇÁ¶óÀÌ Å丣 pPlayerActor->AddTempSkill( 5602 ); // ½ºÅäÄ¿ ex } break; } } // ¸ÕÀú Àӽà ½ºÅ³ºÎÅÍ Ãß°¡Çϰí Àӽà ÀüÁ÷Çϵµ·Ï Ŭ¶ó¿¡ º¸³»Áà¾ß Ŭ¶ó¿¡¼­ Á¦´ë·Î ½ºÅ³Æ®¸®°¡ // ÃʱâÈ­ µÈ´Ù. pPlayerActor->SendTempJobChange( iSecondChangeJobID ); } } #ifndef _FINAL_BUILD wstring wszString = FormatW(L"°ÔÀÓ¼­¹ö¿¡¼­¸¸ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù.\r\n"); pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() ); #endif // _FINAL_BUILD return 1; } int api_user_ClearSecondJobSkill(CDNGameRoom *pRoom, UINT nUserObjectID) { CDNUserSession * pSession = pRoom->GetUserSession(nUserObjectID); if (!pSession) { return -1; } CDnPlayerActor* pPlayerActor = pSession->GetPlayerActor(); if( pPlayerActor ) { // Ŭ¶óÂÊÀ¸·Îµµ ÆÐŶ ³ª°¨. pPlayerActor->RemoveAllTempSkill(); pPlayerActor->EndAddTempSkillAndSendRestoreTempJobChange(); } #ifndef _FINAL_BUILD wstring wszString = FormatW(L"°ÔÀÓ¼­¹ö¿¡¼­¸¸ »ç¿ë °¡´ÉÇÑ ±â´ÉÀÔ´Ï´Ù.\r\n"); pSession->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() ); #endif // _FINAL_BUILD return 1; } int api_user_RepairItem(CDNGameRoom *pRoom, UINT nUserObjectID, int iAllRepair) { #if defined( PRE_ADD_REPAIR_NPC ) CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if( !pUser ) return -1; return DNScriptAPI::api_user_RepairItem(pUser, iAllRepair); #else return -1; #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) } int api_ui_OpenExchangeEnchant(CDNGameRoom *pRoom, UINT nUserObjectID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) return -1; return DNScriptAPI::api_ui_OpenExchangeEnchant(pUser); } //------------------------------------------------------------------------------------------------------- // trigger int api_trigger_GetPartyCount( CDNGameRoom *pRoom ) { if( !pRoom ) return 0; return pRoom->GetUserCount(); } int api_trigger_GetPartyActor( CDNGameRoom *pRoom, int nPartyIndex ) { if(!pRoom) return 0; CDNUserSession * pSession = pRoom->GetUserData( nPartyIndex - 1 ); if(!pSession) return 0; return pSession->GetSessionID(); } bool api_trigger_IsInsidePlayerToEventArea( CDNGameRoom *pRoom, int nActorHandle, int nEventAreaHandle ) { if(!pRoom) return false; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return false; // if( hActor->IsDie() ) return false; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return false; return VecArea[0]->CheckArea( *hActor->GetPosition() ); } void api_trigger_SetActionToProp( CDNGameRoom *pRoom, int nPropHandle, const char *szAction ) { if(!pRoom) return; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return; int nPropType = ((CDnWorldProp*)VecProp[0])->GetPropType(); switch( nPropType ) { case PTE_Static: case PTE_Camera: return; default: { CDnWorldActProp *pProp = static_cast(VecProp[0]); pProp->CmdAction( szAction ); } break; } } void api_trigger_ShowDungeonClear( CDNGameRoom *pRoom, bool bClear, bool bIgnoreRewardItem ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; PROFILE_TICK_TEST( pTask->RequestDungeonClear( bClear, CDnActor::Identity(), bIgnoreRewardItem ) ); } void api_trigger_SetPermitGate( CDNGameRoom *pRoom, int nGateIndex, int nOpenClose ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; EWorldEnum::PermitGateEnum PermitFlag; if( nOpenClose == 0 ) PermitFlag = EWorldEnum::PermitClose; else PermitFlag = EWorldEnum::PermitEnter; pTask->RequestChangeGateInfo( (char)nGateIndex, PermitFlag ); } int api_trigger_GetMonsterAreaLiveCount( CDNGameRoom *pRoom, int nEventAreaHandle ) { if(!pRoom) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; return pTask->GetBirthAreaLiveCount( nEventAreaHandle ); } int api_trigger_GetMonsterAreaTotalCount( CDNGameRoom *pRoom, int nEventAreaHandle ) { if(!pRoom) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; return pTask->GetBirthAreaTotalCount( nEventAreaHandle ); } void api_trigger_RebirthMonster( CDNGameRoom *pRoom, int nEventAreaHandle ) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_RebirthMonster" ); // ÀÌÇÔ¼ö´Â Á» ´À¸®´Ù.. ³ªÁß¿¡ ¹Ì¸® ÅÂÀÌºí ¸¸µé¾î³õ´øÁö ¾²Áö ¸»´øÁö.. if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; switch( VecArea[0]->GetControl()->GetUniqueID() ) { case ETE_UnitArea: { char szAreaName[64] = { 0, }; int nMonsterTableID = -1; sscanf_s( VecArea[0]->GetName(), "%s %d", szAreaName, sizeof(szAreaName), &nMonsterTableID ); UnitAreaStruct *pStruct = (UnitAreaStruct *)VecArea[0]->GetData(); if( !pStruct->vCount ) return; if( stricmp( szAreaName, "monster" ) == NULL ) { api_trigger_GenerationMonster( pRoom, nEventAreaHandle, nMonsterTableID, (int)pStruct->vCount->x, (int)pStruct->vCount->y, 1 ); } else if( stricmp( szAreaName, "monstergroup" ) == NULL ) { api_trigger_GenerationMonsterGroup( pRoom, nEventAreaHandle, nMonsterTableID, (int)pStruct->vCount->x, (int)pStruct->vCount->y, 1 ); } else { DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TACTOR ); int nActorTableID = pSox->GetItemIDFromField( "_StaticName", szAreaName ); if( nActorTableID == -1 ) return; UnitAreaStruct *pLocalStruct = (UnitAreaStruct *)VecArea[0]->GetData(); int nCount = 1; if( pLocalStruct->vCount ) { nCount = (int)pLocalStruct->vCount->x + _rand(pRoom)%( ( (int)pLocalStruct->vCount->y + 1 ) - (int)pLocalStruct->vCount->x ); } EtVector3 vPos; SOBB Box; Box = *VecArea[0]->GetOBB(); for( int i=0; iMonsterSpawn == 0) vPos = pTask->GetGenerationRandomPosition( &Box ); else vPos = Box.Center; pTask->RequestGenerationMonsterFromActorID( nMonsterTableID, nActorTableID, vPos, EtVector3( 0.f, 0.f, 0.f ), EtVector3( 0.f, 0.f, 0.f ), &Box, nEventAreaHandle ); } } } break; case ETE_MonsterSetArea: { MonsterSetAreaStruct *pLocalStruct = (MonsterSetAreaStruct *)VecArea[0]->GetData(); api_trigger_GenerationMonsterSet( pRoom, nEventAreaHandle, pLocalStruct->nSetID, pLocalStruct->nPosID, 1, false ); } break; } PROFILE_TICK_TEST_BLOCK_END(); } void api_trigger_GenerationMonster( CDNGameRoom *pRoom, int nEventAreaHandle, int nMonsterTableID, int nMin, int nMax, int nTeamSetting ) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_GenerationMonster" ); if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; int nMonsterSpawn = pTask->GetMonsterSpawnType(nEventAreaHandle); int nTemp = nMax - nMin; if( nTemp < 1 ) nTemp = 1; int nCount = nMin + ( _rand(pRoom)%nTemp ); EtVector3 vPos; SOBB Box = *VecArea[0]->GetOBB(); for( int i=0; iGetGenerationRandomPosition( &Box ); else vPos = Box.Center; pTask->RequestGenerationMonsterFromMonsterID( nMonsterTableID, vPos, EtVector3( 0.f, 0.f, 0.f ), EtVector3( 0.f, 0.f, 0.f ), &Box, nEventAreaHandle, nTeamSetting ); } PROFILE_TICK_TEST_BLOCK_END(); } void api_trigger_GenerationMonsterGroup( CDNGameRoom *pRoom, int nEventAreaHandle, int nMonsterGroupID, int nMin, int nMax, int nTeamSetting ) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_GenerationMonsterGroup" ); if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; int nTemp = nMax - nMin; if( nTemp < 1 ) nTemp = 1; int nCount = nMin + ( _rand(pRoom)%nTemp ); EtVector3 vPos; SOBB Box = *VecArea[0]->GetOBB(); pTask->RequestGenerationMonsterFromMonsterGroupID( nMonsterGroupID, nCount, Box, nEventAreaHandle, NULL, nTeamSetting ); PROFILE_TICK_TEST_BLOCK_END(); } void api_trigger_GenerationMonsterSet( CDNGameRoom *pRoom, int nEventAreaHandle, int nSetID, int nPosID, int nTeamSetting, bool bResetReference ) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_GenerationMonsterSet" ); if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; EtVector3 vPos; SOBB Box = *VecArea[0]->GetOBB(); if( nSetID == 0 || nPosID == 0 ) { if( VecArea[0]->GetControl()->GetUniqueID() == ETE_MonsterSetArea ) { MonsterSetAreaStruct *pStruct = (MonsterSetAreaStruct *)VecArea[0]->GetData(); if( nSetID == 0 ) nSetID = pStruct->nSetID; if( nPosID == 0 ) nPosID = pStruct->nPosID; } else { if( nSetID == 0 || nPosID == 0 ) return; } } pTask->RequestGenerationMonsterFromSetMonsterID( nSetID, nPosID, Box, nEventAreaHandle, NULL, nTeamSetting, bResetReference ); PROFILE_TICK_TEST_BLOCK_END(); } void api_trigger_GenerationMonsterSetInEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nChangeSetID, int nChangePosID, int nTeamSetting, bool bResetReference ) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_GenerationMonsterSetInEventArea" ); if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; std::vector VecArea2; pRoom->GetWorld()->ScanEventArea( *VecArea[0]->GetOBB(), &VecArea2 ); for( DWORD i=0; iGetControl()->GetUniqueID() != ETE_MonsterSetArea || VecArea2[i]->GetCreateUniqueID() == nEventAreaHandle ) { VecArea2.erase( VecArea2.begin () + i ); i--; } } if( VecArea2.empty() ) return; pTask->RequestGenerationMonsterFromSetMonsterID( nChangeSetID, nChangePosID, VecArea2, NULL, nTeamSetting, bResetReference ); PROFILE_TICK_TEST_BLOCK_END(); } void api_trigger_CmdMoveMonster( CDNGameRoom* pRoom, int nEventAreaHandle, int nTargetEventAreaHandle ) { api_trigger_CmdRandMoveMonster( pRoom, nEventAreaHandle, nTargetEventAreaHandle, 100 ); } void api_trigger_CmdRandMoveMonster( CDNGameRoom* pRoom, int nEventAreaHandle, int nTargetEventAreaHandle, UINT uiMoveFrontRate ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; if( !pRoom->GetWorld() ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); if( hVecList.empty() ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nTargetEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; for( DWORD i=0; iIsMonsterActor() ) continue; CDnMonsterActor* pMonster = static_cast(hVecList[i].GetPointer()); pMonster->SetNaviDestination( VecArea[0]->GetOBB(), uiMoveFrontRate ); } } bool api_trigger_CheckMonsterIsInsideArea( CDNGameRoom* pRoom, int nEventAreaHandle, int nTargetEventAreaHandle ) { if(!pRoom) return false; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return false; return pTask->CheckMonsterIsInsideArea( nEventAreaHandle, nTargetEventAreaHandle ); } bool api_trigger_CheckMonsterLessHP( CDNGameRoom* pRoom, int iMonsterID, int iHP ) { if( !pRoom ) return false; CDnGameTask* pGameTask = static_cast(pRoom->GetTaskMng()->GetTask("GameTask") ); if( !pGameTask ) return false; return pGameTask->CheckMonsterLessHP( iMonsterID, iHP ); } bool api_trigger_CheckInsideAreaMonsterLessHP( CDNGameRoom* pRoom, int iAreaUniqueID, int iHP ) { if( !pRoom ) return false; CDnGameTask* pGameTask = static_cast(pRoom->GetTaskMng()->GetTask("GameTask") ); if( !pGameTask ) return false; return pGameTask->CheckInsideAreaMonsterLessHP( iAreaUniqueID, iHP ); } int api_trigger_GenerationNpc(CDNGameRoom *pRoom, int nEventAreaHandle, int nNpcTableID) { if(!pRoom) return -1; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return -1; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return -1; EtVector3 vPos; CEtWorldEventArea* pArea = VecArea[0]; vPos.x = pArea->GetMin()->x + ((int)(pArea->GetMax()->x - pArea->GetMin()->x) / 2); vPos.z = pArea->GetMin()->z + ((int)(pArea->GetMax()->z - pArea->GetMin()->z) / 2); vPos.y = pRoom->GetWorld()->GetHeight( vPos ); pTask->RequestGenerationNpc(nNpcTableID, vPos.x , vPos.y, vPos.z, pArea->GetRotate(), nEventAreaHandle ); return 1; } /* desc : EventArea ¿¡ NPC ¸¦ Á¦°ÅÇÑ´Ù. param : À̺¥Æ®¿µ¿ª id return : -1 => À̺¥Æ®¿µ¿ª ãÀ»¼ö ¾øÀ½, 1ÀÌ¸é ¼º°ø */ int api_trigger_DestroyNpc(CDNGameRoom *pRoom, int nEventAreaHandle) { if(!pRoom) return -1; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return -1; pTask->RequestDestroyNpc(nEventAreaHandle); return 1; } void api_trigger_SetGameSpeed( CDNGameRoom *pRoom, float fPlaySpeed, DWORD dwDelay ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pTask->RequestChangeGameSpeed( fPlaySpeed, dwDelay ); } void api_trigger_ShowProp( CDNGameRoom *pRoom, int nPropHandle, bool bShow ) { std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return; CDnWorldProp *pProp = static_cast( VecProp[0] ); if( !pProp ) return; #ifdef PRE_FIX_PROP_SHOW_BY_TRIGGER bool bResult = pProp->SetShowInfo(PropDef::Option::eTrigger, bShow ? PropDef::Option::True : PropDef::Option::False); if (bResult == false) { DN_ASSERT(bResult, "Invalid! api_trigger_ShowProp"); return; } #endif pProp->CmdShow( bShow ); } bool api_trigger_IsAllDieMonster( CDNGameRoom *pRoom, bool bCheckTeam ) { bool bAllDie = true; DnActorHandle hActor; for( DWORD i=0; iGetRoomID()].size(); i++ ) { hActor = CDnActor::s_pVecProcessList[pRoom->GetRoomID()][i]->GetMySmartPtr(); if( !hActor ) continue; if( !hActor->IsMonsterActor() ) continue; if( bCheckTeam && hActor->GetTeam() == 0 ) continue; if( !hActor->IsDie() ) { bAllDie = false; break; } } return bAllDie; } int api_trigger_GetLastAimPropHandle( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "LastOperationProp" ); /* if( !pRoom->GetWorld()->GetLastOperationProp() ) return -1; return pRoom->GetWorld()->GetLastOperationProp()->GetCreateUniqueID(); */ } int api_trigger_GetLastAimPropActor( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "LastOperationActor" ); /* if( !pRoom->GetWorld()->GetLastOperationActor() ) return -1; return pRoom->GetWorld()->GetLastOperationActor()->GetUniqueID(); */ } bool api_trigger_IsProp( CDNGameRoom *pRoom, int nPropHandle ) { if(!pRoom) return false; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return false; CDnWorldProp *pProp = static_cast( VecProp[0] ); if( !pProp ) return false; return pProp->IsShow(); } bool api_trigger_IsBrokenProp( CDNGameRoom *pRoom, int nPropHandle ) { if(!pRoom) return false; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return false; // ClassID °¡ ¾È¸ÂÀ¸¸é ¾ÈºÎ¼ÅÁ³À½. switch( ((CDnWorldProp*)VecProp[0])->GetPropType() ) { case PTE_Broken: case PTE_BrokenDamage: case PTE_HitMoveDamageBroken: case PTE_BuffBroken: case PTE_ShooterBroken: { CDnWorldBrokenProp *pProp = static_cast( VecProp[0] ); return pProp->IsBroken(); } break; } return false; } int api_trigger_GetLastBrokenPropActor( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "LastBrokenPropActor" ); } void api_trigger_DestroyMonsterArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nDropType ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); bool bDropItem = false; bool bAddExp = false; switch( nDropType ) { case 1: bDropItem = true; break; // ¾ÆÀÌÅÛ µå¶ø case 2: bAddExp = true; break; // °æÇèÄ¡ case 3: bDropItem = bAddExp = true; // °æÇèÄ¡ + ¾ÆÀÌÅÛ } for( DWORD i=0; iIsMonsterActor() ) continue; /* if( bAddExp ) { ((CDnMonsterActor*)hVecList[i].GetPointer())->EnableDropItem( false ); ((CDnMonsterActor*)hVecList[i].GetPointer())->OnDie( DnActorHandle() ); } */ hVecList[i]->CmdSuicide( bDropItem, bAddExp ); } } void api_trigger_DestroyAllMonster( CDNGameRoom *pRoom, bool bDropItem, int nTeam ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pTask->RequestDestroyAllMonster( bDropItem, nTeam ); } void api_trigger_SetMonsterAIState( CDNGameRoom *pRoom, int nEventAreaHandle, int nType ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); CDnMonsterActor *pMonster; for( DWORD i=0; iIsMonsterActor() ) continue; pMonster = static_cast(hVecList[i].GetPointer()); pMonster->SetAIState( (MAAiReceiver::AIState)nType ); } } void api_trigger_PlayCutSceneByTrigger( CDNGameRoom *pRoom, int nCutSceneTableID, bool bFadeIn, int nQuestIndex, int nQuestStep ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pTask->RequestPlayCutScene( nCutSceneTableID, bFadeIn, nQuestIndex, nQuestStep ); } int api_trigger_GetGameTime( CDNGameRoom *pRoom ) { if(!pRoom) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; if( !pTask->IsSyncComplete() ) return 0; return (int)( pTask->GetLocalTime() / 1000 ); } bool api_trigger_Delay( CDNGameRoom *pRoom, CEtTriggerElement *pElement, int nDelay ) { if( !pElement ) return true; if( !pRoom ) return true; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return true; if( !pTask->IsSyncComplete() ) return false; if( pElement->GetLastExcuteTime() == -1 ) pElement->SetLastExcuteTime( pTask->GetLocalTime() ); #if !defined( PRE_TRIGGER_TEST ) if( (DWORD)pTask->GetLocalTime() - pElement->GetLastExcuteTime() < nDelay ) return false; #endif // #if defined( PRE_TRIGGER_TEST ) return true; } int api_trigger_GetBattleModeCount( CDNGameRoom *pRoom, int nEventAreaHandle ) { if(!pRoom) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); int nCount = 0; CDnMonsterActor *pActor; for( DWORD i=0; iIsMonsterActor() ) continue; pActor = static_cast(hVecList[i].GetPointer()); if( pActor->GetAggroTarget() ) nCount++; } return nCount; } char *api_trigger_GetActionToProp( CDNGameRoom *pRoom, int nPropHandle ) { if(!pRoom) return ""; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return ""; int nPropType = ((CDnWorldProp*)VecProp[0])->GetPropType(); switch( nPropType ) { case PTE_Static: case PTE_Camera: break; default: { CDnWorldActProp *pProp = static_cast(VecProp[0]); return (char*)pProp->GetCurrentAction(); } } return ""; } void api_trigger_ChangeMapByTrigger( CDNGameRoom *pRoom, int nMapIndex, int nGateNo ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; #if defined( PRE_TRIGGER_TEST ) return; #endif // #if defined( PRE_TRIGGER_TEST ) pTask->RequestChangeMap( nMapIndex, nGateNo ); } int api_trigger_GetTalkNpcClassID( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; int nValue = pObject->GetEventValueStore( "LastTalkNpc" ); DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nValue ); if( !hActor ) return -1; CDnNPCActor *pNpc = (CDnNPCActor *)hActor.GetPointer(); return pNpc->GetNpcClassID(); } int api_trigger_GetTalkNpcActor( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { /* if(!pRoom) return -1; DnActorHandle hNpc = pRoom->GetWorld()->GetLastTalkNpc(); if( !hNpc ) return -1; return hNpc->GetUniqueID(); */ if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "LastTalkNpc" ); } int api_trigger_GetTalkNpcTargetActor( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { /* if(!pRoom) return -1; DnActorHandle hActor = pRoom->GetWorld()->GetLastTalkNpcPlayer(); if( !hActor ) return -1; return hActor->GetUniqueID(); */ if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "LastTalkActor" ); } void api_trigger_AllUserEnableOperatorProp( CDNGameRoom *pRoom, int nPropHandle, bool bEnable ) { if(!pRoom) return; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return; ((CDnWorldProp*)VecProp[0])->EnableOperator( bEnable ); } void api_trigger_EnableOperatorProp( CDNGameRoom *pRoom, int nPropHandle, int nActorHandle, bool bEnable ) { if(!pRoom) return; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return; DnActorHandle hActor; if( nActorHandle == 0 || nActorHandle == -1 ) { for( DWORD i=0; iGetUserCount(); i++ ) { hActor = pRoom->GetUserData(i)->GetActorHandle(); ((CDnWorldProp*)VecProp[0])->CmdEnableOperator( hActor, bEnable ); } } else { hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; ((CDnWorldProp*)VecProp[0])->CmdEnableOperator( hActor, bEnable ); } } void api_trigger_SetActionToPropActor( CDNGameRoom *pRoom, int nPropHandle, int nActorHandle, const char *szAction ) { if(!pRoom) return; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return; CDnWorldActProp *pProp = NULL; int nPropType = ((CDnWorldProp*)VecProp[0])->GetPropType(); switch( nPropType ) { case PTE_Static: case PTE_Camera: return; default: pProp = static_cast(VecProp[0]); break; } if( !pProp ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; pProp->CmdAction( hActor, szAction ); } void api_trigger_EnableTriggerElement( CDNGameRoom *pRoom, CEtTriggerElement *pElement, bool bEnable ) { if( !pRoom ) return; if( !pElement ) return; pElement->SetEnable( bEnable ); } void api_trigger_SetActionToActor( CDNGameRoom *pRoom, int nEventAreaHandle, const char *szAction, int nLoopCount, float fBlendFrame ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iCmdAction( szAction, nLoopCount, fBlendFrame ); } } void api_trigger_EnableOperatorNpc( CDNGameRoom *pRoom, int nEventAreaHandle, int nActorHandle, bool bEnable ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iIsNpcActor() ) continue; CDnNPCActor *pNpc = static_cast(hNpc.GetPointer()); DnActorHandle hActor; if( nActorHandle == 0 || nActorHandle == -1 ) { for( DWORD j=0; jGetUserCount(); j++ ) { hActor = pRoom->GetUserData(j)->GetActorHandle(); pNpc->CmdEnableOperator( hActor, bEnable ); } } else { hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) continue; pNpc->CmdEnableOperator( hActor, bEnable ); } } } void api_trigger_EnableOperatorNpcFromPropNpc( CDNGameRoom *pRoom, int nPropHandle, int nActorHandle, bool bEnable ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector pVecList; CDnWorld::GetInstance(pRoom).FindPropFromCreateUniqueID( nPropHandle, &pVecList ); if( pVecList.empty() ) return; for( DWORD i=0; iGetPropType() != PTE_Npc ) continue; DnActorHandle hNpc = ((CDnWorldNpcProp*)pProp)->GetActorHandle(); if( !hNpc || !hNpc->IsNpcActor() ) continue; CDnNPCActor *pNpc = static_cast(hNpc.GetPointer()); DnActorHandle hActor; if( nActorHandle == 0 || nActorHandle == -1 ) { for( DWORD j=0; jGetUserCount(); j++ ) { hActor = pRoom->GetUserData(j)->GetActorHandle(); pNpc->CmdEnableOperator( hActor, bEnable ); } } else { hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) continue; pNpc->CmdEnableOperator( hActor, bEnable ); } } } void api_trigger_EnableTriggerObject( CDNGameRoom *pRoom, const char *szTriggerObjectName, bool bEnable ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pRoom->GetWorld()->EnableTriggerObject( szTriggerObjectName, bEnable ); } void api_trigger_EnableMonsterNoDamage( CDNGameRoom *pRoom, int nEventAreaHandle, bool bEnable ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); CDnMonsterActor *pMonster; for( DWORD i=0; iIsMonsterActor() ) continue; pMonster = static_cast(hVecList[i].GetPointer()); pMonster->EnableNoDamage( bEnable ); } } void api_trigger_WarpActor( CDNGameRoom *pRoom, int nActorHandle, int nTargetEventAreaHandle ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nTargetEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; #if defined(PRE_ADD_POSITIONHACK_POS_LOG) if( hActor->IsPlayerActor() && pRoom->bIsGuildWarMode()) // ÇÁ¶øÀ» Ŭ¸¯ÇßÀ»¶§ InvalidCount°¡ ÀÖÀ¸¸é ÁÂÇ¥¸¦ ³²±âµµ·Ï ·Î±×¸¦ Ãß°¡ÇÕ´Ï´Ù. { CDnPlayerActor* pPlayerActor = static_cast(hActor.GetPointer()); if( pPlayerActor && pPlayerActor->GetPlayerSpeedHackChecker() ) ((CDnPlayerSpeedHackChecker*)pPlayerActor->GetPlayerSpeedHackChecker())->CheckInvalidActorAndPositionLog(); } #endif // #if defined(PRE_ADD_POSITIONHACK_POS_LOG) SOBB *pOBB = VecArea[0]->GetOBB(); hActor->CmdWarp( pOBB->Center, EtVec3toVec2( pOBB->Axis[2] ), NULL, true ); } void api_trigger_WarpActorFromEventArea( CDNGameRoom *pRoom, int nMonsterEventAreaHandle, int nTargetEventAreaHandle ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nTargetEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; SOBB *pOBB = VecArea[0]->GetOBB(); DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nMonsterEventAreaHandle, hVecList ); for( DWORD i=0; iCmdWarp( pOBB->Center, EtVec3toVec2( pOBB->Axis[2] ), NULL, true ); } } bool api_trigger_IsInsidePropToEventArea( CDNGameRoom* pRoom, int nPropHandle, int nTargetEventAreaHandle ) { if(!pRoom) return false; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return false; std::vector VecProp; CDnWorld::GetInstance(pRoom).FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return false; std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nTargetEventAreaHandle, &VecArea ); if( VecArea.empty() ) return false; SOBB *pOBB = VecArea[0]->GetOBB(); // Á¤È®ÇÏ°Ô ¹Ú½ºÃæµ¹ üũ SOBB PropOBB; SSphere Sphere; VecProp[0]->GetBoundingBox( PropOBB ); return TestOBBToOBB( *pOBB, PropOBB ); // °£´ÜÇÏ°Ô ÀλçÀ̵å üũ // return pOBB->IsInside( ((CDnWorldProp*)VecProp[0])->GetMatEx()->m_vPosition ); } void api_trigger_ChangeTeamFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nTeam ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iIsMonsterActor() ) continue; CDnMonsterActor *pMonster = static_cast(hVecList[i].GetPointer()); pMonster->CmdChangeTeam( nTeam ); pMonster->SetAggroTarget( CDnActor::Identity() ); } } bool api_trigger_IsDieActor( CDNGameRoom *pRoom, int nActorHandle ) { if(!pRoom) return true; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return true; return hActor->IsDie(); } int api_trigger_GetUserLevelByTrigger( CDNGameRoom *pRoom, int nActorHandle ) { if(!pRoom) return 0; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return 0; return hActor->GetLevel(); } int api_trigger_GetMonsterActorFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nIndex ) { if( !pRoom ) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; DNVector(DnActorHandle) hVecResult; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecResult ); nIndex--; if( nIndex < 0 || nIndex >= (int)hVecResult.size() ) return 0; return hVecResult[nIndex]->GetUniqueID(); } void api_trigger_DropItemToEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nItemID, int nCount, DWORD dwOwnerActorHandle ) { if( !pRoom ) return; #if defined( PRE_FIX_48517 ) // dwOwnerActorHandleÀÌ 0ÀÎ °æ¿ì¿¡´Â ¼ÒÀ¯±Ç¾øÀ½À̹ǷΠ¹«Á¶°Ç µå¶ø if( dwOwnerActorHandle > 0 && !pRoom->GetUserSession( dwOwnerActorHandle ) ) return; #endif CDnItemTask *pTask = (CDnItemTask *)pRoom->GetTaskMng()->GetTask( "ItemTask" ); CDnGameTask *pGameTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; if( !pGameTask ) return; std::vector pVecList; CDnWorld::GetInstance(pRoom).FindEventAreaFromCreateUniqueID( nEventAreaHandle, &pVecList ); if( pVecList.empty() ) return; SOBB *pOBB = pVecList[0]->GetOBB(); EtVector3 vPos; int nMonsterSpawn = pGameTask->GetMonsterSpawnType(nEventAreaHandle); if (nMonsterSpawn == 0) vPos = pGameTask->GetGenerationRandomPosition( pOBB ); else vPos = pOBB->Center; if( nCount > 0 ) { pTask->RequestDropItem( STATIC_INSTANCE_(CDnDropItem::s_dwUniqueCount)++, vPos, nItemID, _roomrand(pRoom), nCount, 0, ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle ); } else { DNVector(CDnItem::DropItemStruct) VecResult; CDnDropItem::CalcDropItemList( pRoom, nItemID, VecResult ); for( DWORD i=0; iRequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle, VecResult[i].nEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pTask->RequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } } } void api_trigger_DropItemToActor( CDNGameRoom *pRoom, int nActorHandle, int nItemID, int nCount, DWORD dwOwnerActorHandle ) { if( !pRoom ) return; CDnItemTask *pTask = (CDnItemTask *)pRoom->GetTaskMng()->GetTask( "ItemTask" ); CDnGameTask *pGameTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; if( !pGameTask ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; EtVector3 vPos = *hActor->GetPosition(); if( nCount > 0 ) { pTask->RequestDropItem( STATIC_INSTANCE_(CDnDropItem::s_dwUniqueCount)++, vPos, nItemID, _roomrand(pRoom), nCount, 0, ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle ); } else { DNVector(CDnItem::DropItemStruct) VecResult; CDnDropItem::CalcDropItemList( pRoom, nItemID, VecResult ); for( DWORD i=0; iRequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle, VecResult[i].nEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pTask->RequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } } } void api_trigger_DropGroupItemToEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nItemID, DWORD dwOwnerActorHandle ) { if( !pRoom ) return; CDnItemTask *pTask = (CDnItemTask *)pRoom->GetTaskMng()->GetTask( "ItemTask" ); CDnGameTask *pGameTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; if( !pGameTask ) return; std::vector pVecList; CDnWorld::GetInstance(pRoom).FindEventAreaFromCreateUniqueID( nEventAreaHandle, &pVecList ); if( pVecList.empty() ) return; SOBB *pOBB = pVecList[0]->GetOBB(); EtVector3 vPos; int nMonsterSpawn = pGameTask->GetMonsterSpawnType(nEventAreaHandle); if (nMonsterSpawn == 0) vPos = pGameTask->GetGenerationRandomPosition( pOBB ); else vPos = pOBB->Center; DNVector(CDnItem::DropItemStruct) VecResult; CDnDropItem::CalcDropItemList( pRoom, pGameTask->GetStageDifficulty(), nItemID, VecResult ); for( DWORD i=0; iRequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle, VecResult[i].nEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pTask->RequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } } void api_trigger_DropGroupItemToActor( CDNGameRoom *pRoom, int nActorHandle, int nItemID, DWORD dwOwnerActorHandle ) { if( !pRoom ) return; CDnItemTask *pTask = (CDnItemTask *)pRoom->GetTaskMng()->GetTask( "ItemTask" ); CDnGameTask *pGameTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; if( !pGameTask ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; EtVector3 vPos = *hActor->GetPosition(); DNVector(CDnItem::DropItemStruct) VecResult; CDnDropItem::CalcDropItemList( pRoom, pGameTask->GetStageDifficulty(), nItemID, VecResult ); for( DWORD i=0; iRequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle, VecResult[i].nEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pTask->RequestDropItem( VecResult[i].dwUniqueID, vPos, VecResult[i].nItemID, VecResult[i].nSeed, VecResult[i].nCount, (short)( ( 360 / VecResult.size() ) * i ), ( dwOwnerActorHandle == 0 ) ? -1 : dwOwnerActorHandle ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } } void api_trigger_ShowChatBalloonToMonsterArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nUIStringIndex ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); if( hVecList.empty() ) return; if( !CEtUIXML::IsActive() ) return; #if defined(PRE_ADD_MULTILANGUAGE) for( DWORD i=0; iCmdChatBalloon( nUIStringIndex ); } } #else //#if defined(PRE_ADD_MULTILANGUAGE) std::wstring wszString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nUIStringIndex ); if( wszString.empty() ) return; for( DWORD i=0; iCmdChatBalloon( wszString.c_str() ); } } #endif //#if defined(PRE_ADD_MULTILANGUAGE) } void api_trigger_ShowChatBalloonToActor( CDNGameRoom *pRoom, int nActorHandle, int nUIStringIndex ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; #if defined(PRE_ADD_MULTILANGUAGE) hActor->CmdChatBalloon( nUIStringIndex ); #else //#if defined(PRE_ADD_MULTILANGUAGE) std::wstring wszString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nUIStringIndex ); if( wszString.empty() ) return; hActor->CmdChatBalloon( wszString.c_str() ); #endif //#if defined(PRE_ADD_MULTILANGUAGE) } void api_trigger_ShowChatBalloonToProp( CDNGameRoom *pRoom, int nPropHandle, int nUIStringIndex ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector pVecList; CDnWorld::GetInstance(pRoom).FindPropFromCreateUniqueID( nPropHandle, &pVecList ); if( pVecList.empty() ) return; CDnWorldProp *pProp = static_cast( pVecList[0] ); if( !pProp ) return; pProp->CmdChatBalloon( nUIStringIndex ); } void api_trigger_HideChatBalloonToMonsterArea( CDNGameRoom *pRoom, int nEventAreaHandle ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); if( hVecList.empty() ) return; if( !CEtUIXML::IsActive() ) return; #if defined(PRE_ADD_MULTILANGUAGE) for( DWORD i=0; iCmdChatBalloon( 0 ); } } #else //#if defined(PRE_ADD_MULTILANGUAGE) for( DWORD i=0; iCmdChatBalloon( L"HIDE_TRIGGER_CHATBALLOON" ); } } #endif //#if defined(PRE_ADD_MULTILANGUAGE) } void api_trigger_HideChatBalloonToProp( CDNGameRoom *pRoom, int nPropHandle ) { // HideÇÔ¼ö¸¦ µû·Î ¸¸µå´Â ´ë½Å ShowÇÔ¼ö¿¡´Ù°¡ UIStringIndex°¡ 0À϶§ ÇÏÀ̵å Çϴ°ŷΠÇÏ·Á´Ù°¡, // ±âȹÀÚºÐÀÌ HideÇÔ¼ö°¡ µû·Î ÀÖ´Â°Ô ÆíÇÏ´Ù°í Çϼż­ ÀÌ·¸°Ô º°µµ·Î ¸¸µé¾îµÓ´Ï´Ù. if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; std::vector pVecList; CDnWorld::GetInstance(pRoom).FindPropFromCreateUniqueID( nPropHandle, &pVecList ); if( pVecList.empty() ) return; CDnWorldProp *pProp = static_cast( pVecList[0] ); if( !pProp ) return; pProp->CmdChatBalloon( 0 ); } void api_trigger_SetForceAggroToMonsterArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nTargetEventArea, int nValue ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; DNVector(DnActorHandle) hVecTargetList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); pTask->GetBirthAreaLiveActors( nTargetEventArea, hVecTargetList ); if( hVecList.empty() || hVecTargetList.empty() ) return; for( DWORD i=0; iIsMonsterActor() ) { CDnMonsterActor *pMonster = static_cast(hVecList[i].GetPointer()); pMonster->GetAggroSystem()->AddAggro( hVecTargetList[_rand(pRoom)%hVecTargetList.size()], nValue, true ); } } } void api_trigger_SetForceAggroToProp( CDNGameRoom *pRoom, int nEventAreaHandle, int nPropHandle, int nValue ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); if( hVecList.empty() ) return; std::vector pVecTargetList; CDnWorld::GetInstance(pRoom).FindPropFromCreateUniqueID( nPropHandle, &pVecTargetList ); if( pVecTargetList.empty() ) return; MAActorProp *pActorProp = dynamic_cast(pVecTargetList[0]); if( !pActorProp ) return; DnActorHandle hTargetActor = pActorProp->GetActorHandle(); if( !hTargetActor ) return; for( DWORD i=0; iIsMonsterActor() ) { CDnMonsterActor *pMonster = static_cast(hVecList[i].GetPointer()); pMonster->GetAggroSystem()->AddAggro( hTargetActor, nValue, true ); } } } void api_trigger_ShowExposureInfo( CDNGameRoom *pRoom, int nEventAreaHandle, bool bShow ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); if( hVecList.empty() ) return; for( DWORD i=0; iCmdShowExposureInfo( bShow ); } } } void api_trigger_DLChangeRound( CDNGameRoom *pRoom, bool bBoss, int iNextTotalRound/*=0*/ ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; if( pTask->GetGameTaskType() != GameTaskType::DarkLair ) return; CDnDLGameTask *pDLTask = (CDnDLGameTask *)pTask; #ifdef PRE_MOD_DARKLAIR_RECONNECT pDLTask->UpdateRound( iNextTotalRound, bBoss ); #else // PRE_MOD_DARKLAIR_RECONNECT pDLTask->UpdateRound( iNextTotalRound ); #endif // PRE_MOD_DARKLAIR_RECONNECT } int api_trigger_DLGetRound( CDNGameRoom *pRoom ) { if( !pRoom ) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; if( pTask->GetGameTaskType() != GameTaskType::DarkLair ) return 0; return ((CDnDLGameTask*)pTask)->GetRound(); } int api_trigger_DLGetTotalRound( CDNGameRoom *pRoom ) { if( !pRoom ) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; if( pTask->GetGameTaskType() != GameTaskType::DarkLair ) return 0; return ((CDnDLGameTask*)pTask)->GetTotalRound(); } int api_trigger_DLGetStartFloor( CDNGameRoom *pRoom ) { if( !pRoom ) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; if( pTask->GetGameTaskType() != GameTaskType::DarkLair ) return 0; return static_cast(pTask)->GetStartFloor(); } int api_trigger_DLRequestChallenge( CDNGameRoom *pRoom ) { if( !pRoom ) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; if( pTask->GetGameTaskType() != GameTaskType::DarkLair ) return 0; CDnDLGameTask* pDLGameTask = static_cast(pTask); pDLGameTask->ChangeDungeonClearState( CDnGameTask::DCS_DLRequestChallenge ); return 1; } int api_trigger_DLResponseChallenge( CDNGameRoom *pRoom ) { if( !pRoom ) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; if( pTask->GetGameTaskType() != GameTaskType::DarkLair ) return 0; CDnDLGameTask* pDLGameTask = static_cast(pTask); return pDLGameTask->GetChallengeResponse(); } void api_trigger_DLSetStartRound( CDNGameRoom *pRoom, int iRound ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; if( pTask->GetGameTaskType() != GameTaskType::DarkLair ) return; CDnDLGameTask* pDLGameTask = static_cast(pTask); pDLGameTask->SetStartRound( iRound ); return; } void api_trigger_EnableDungeonClearWarpQuestFlag(CDNGameRoom* pRoom) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pTask->EnableDungeonClearWarpQuestFlag(); } bool api_trigger_IsEnableDungeonClearWarp(CDNGameRoom* pRoom) { if( !pRoom ) return false; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return false; return (pTask->GetDungeonClearState() == CDnGameTask::DCS_WarpStandBy); } bool api_trigger_IsExistNotAchieveMissionPartyActor( CDNGameRoom *pRoom, int nMissionArrayIndex ) { if( !pRoom ) return false; TMissionData *pData = g_pDataManager->GetMissionData(nMissionArrayIndex); if( !pData || !pData->bActivate ) return false; for( DWORD i=0; iGetUserCount(); i++ ) { CDNUserSession *pSession = pRoom->GetUserData(i); if( !pSession ) continue; if( GetBitFlag( pSession->GetMissionData()->MissionAchieve, nMissionArrayIndex ) == false ) return true; } return false; } int api_trigger_GetChangeActionPlayerActor( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "ChangeActionPlayer" ); } char *api_trigger_GetActionToPlayerActor( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return ""; if( !pElement ) return ""; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return ""; int nSessionID = pObject->GetEventValueStore( "ChangeActionPlayer" ); int nIndex; CDNGameRoom::PartyStruct *pStruct = pRoom->GetPartyDatabySessionID( nSessionID, nIndex ); if( !pStruct ) return ""; if( !pStruct->pSession ) return ""; if( !pStruct->pSession->GetActorHandle() ) return ""; return (char*)pStruct->pSession->GetActorHandle()->GetCurrentAction(); } void api_trigger_EnablePropNoDamage( CDNGameRoom *pRoom, int nPropHandle, bool bEnable ) { if( !pRoom ) return; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return; CDnWorldProp *pProp = static_cast( VecProp[0] ); if( !pProp ) return; switch( pProp->GetPropType() ) { case PTE_Broken: case PTE_BrokenDamage: case PTE_HitMoveDamageBroken: case PTE_BuffBroken: case PTE_ShooterBroken: ((CDnWorldBrokenProp*)pProp)->EnableNoDamage( bEnable ); break; default: return; } } int api_trigger_GetTriggerEventSignalEventAreaHandle( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "EventArea" ); } int api_trigger_GetTriggerEventSignalActorHandle( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "ActorHandle" ); } int api_trigger_GetTriggerEventSignalEventID( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; return pObject->GetEventValueStore( "EventID" ); } int api_trigger_GetTriggerEventSignalTeam( CDNGameRoom *pRoom, CEtTriggerElement *pElement ) { if(!pRoom) return -1; if( !pElement ) return -1; CEtTriggerObject *pObject = pElement->GetTriggerObject(); if( !pObject ) return -1; int nSessionID = pObject->GetEventValueStore( "ActorHandle" ); CDNUserSession * pUser = pRoom->GetUserSession(nSessionID); if( !pUser ) return -1; return pUser->GetTeam(); } void api_trigger_HoldPartyDice(CDNGameRoom* pRoom) { if( !pRoom ) return; CDnPartyTask::GetInstance(pRoom).HoldSharingReversionItem(); } void api_trigger_ReleasePartyDice(CDNGameRoom* pRoom) { if( !pRoom ) return; CDnPartyTask::GetInstance(pRoom).ReleaseSharingReversionItem(); } void api_trigger_UpdateNestTryCount(CDNGameRoom *pRoom, int iForceMapIndex/*=0*/ ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pTask->RequestNestDungeonClear( iForceMapIndex ); } void api_trigger_UpdateUserNestTryCount(CDNGameRoom *pRoom, int nActorHandle ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; pTask->RequestNestDungeonClear( hActor ); } int api_trigger_GetMonsterClassID( CDNGameRoom *pRoom, int nActorHandle ) { if( !pRoom ) return 0; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return 0; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return 0; if( !hActor->IsMonsterActor() ) return 0; return ((CDnMonsterActor*)hActor.GetPointer())->GetMonsterClassID(); } void api_trigger_EnableDungeonClearWarpAlarm( CDNGameRoom *pRoom, bool bEnable ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; pTask->RequestEnableDungeonClearWarpAlarm( bEnable ); } void api_trigger_SetHPFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nValue ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iCmdRefreshHPSP( nValue, hActor->GetSP() ); } } void api_trigger_SetHP( CDNGameRoom *pRoom, int nActorHandle, int nValue ) { if( !pRoom ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; hActor->CmdRefreshHPSP( nValue, hActor->GetSP() ); } void api_trigger_SetHPRatioFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, float fValue ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iGetMaxHP() * fValue ); hActor->CmdRefreshHPSP( nResult, hActor->GetSP() ); // printf("[RLKT_DEBUG][%s][ActorID: %d] CurHP: %lld ResultHP: %lld modValue: %.6f SP: %d \n", __FUNCTION__, hActor->GetClassID(), hActor->GetMaxHP(), nResult, fValue, hActor->GetSP()); } } void api_trigger_SetHPRatio( CDNGameRoom *pRoom, int nActorHandle, float fValue ) { if( !pRoom ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; INT64 nResult = (INT64)( hActor->GetMaxHP() * fValue ); hActor->CmdRefreshHPSP( nResult, hActor->GetSP() ); } void api_trigger_AddHPAbsoluteFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nValue ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iGetHP() + nValue; if( nResult > hActor->GetMaxHP() ) nResult = hActor->GetMaxHP(); if( nResult < 1 ) nResult = 1; hActor->CmdRefreshHPSP( nResult, hActor->GetSP() ); } } void api_trigger_AddHPRatioFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, float fValue ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iGetHP() + (INT64)( hActor->GetMaxHP() * fValue ); if( nResult > hActor->GetMaxHP() ) nResult = hActor->GetMaxHP(); if( nResult < 1 ) nResult = 1; hActor->CmdRefreshHPSP( nResult, hActor->GetSP() ); } } void api_trigger_AddHPAbsolute( CDNGameRoom *pRoom, int nActorHandle, int nValue ) { if( !pRoom ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; INT64 nResult = hActor->GetHP() + nValue; if( nResult > hActor->GetMaxHP() ) nResult = hActor->GetMaxHP(); if( nResult < 1 ) nResult = 1; hActor->CmdRefreshHPSP( nResult, hActor->GetSP() ); } void api_trigger_AddHPRatio( CDNGameRoom *pRoom, int nActorHandle, float fValue ) { if( !pRoom ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; INT64 nResult = hActor->GetHP() + (INT64)( hActor->GetMaxHP() * fValue ); if( nResult > hActor->GetMaxHP() ) nResult = hActor->GetMaxHP(); if( nResult < 1 ) nResult = 1; hActor->CmdRefreshHPSP( nResult, hActor->GetSP() ); } int api_trigger_GetTeamFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle ) { if( !pRoom ) return -1; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return -1; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iGetTeam(); } return -1; } int api_trigger_GetTeam( CDNGameRoom *pRoom, int nActorHandle ) { if( !pRoom ) return -1; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return -1; return hActor->GetTeam(); } void api_trigger_IgnoreAggroFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nValue ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iGetAggroSystem() ) continue; hVecList[i]->GetAggroSystem()->SetIgnoreFlag( (nValue == 0) ? false : true ); } } int api_trigger_GetPropDurability( CDNGameRoom *pRoom, int nPropHandle ) { if(!pRoom) return 0; std::vector VecProp; pRoom->GetWorld()->FindPropFromCreateUniqueID( nPropHandle, &VecProp ); if( VecProp.empty() ) return 0; CDnWorldProp *pProp = static_cast( VecProp[0] ); if( !pProp ) return 0; int nPropType = pProp->GetPropType(); switch( nPropType ) { case PTE_Broken: case PTE_BrokenDamage: case PTE_BuffBroken: case PTE_HitMoveDamageBroken: case PTE_ShooterBroken: return ((CDnWorldBrokenProp*)pProp)->GetDurability(); default: break; } return 0; } void api_trigger_NotUseManaSkill( CDNGameRoom *pRoom, int nActorHandle ) { DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; if( hActor->IsPlayerActor() ) static_cast(hActor.GetPointer())->OnBattleToggle( false ); hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_078, -1, "", true ); } bool api_trigger_NoDuplicateBuffFromEventArea( CDNGameRoom *pRoom, int nActorHandle, int nSkillID, int nSkillLevel, int nDelay) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_NoDuplicateBuffFromEventArea" ); if( !pRoom ) return false; CDnSkill::SkillInfo sSkillInfo; std::vector vecSkillEffectList; CDnSkill::CreateSkillInfo( nSkillID, nSkillLevel, sSkillInfo, vecSkillEffectList ); sSkillInfo.bIgnoreImmune = true; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); DnActorHandle hVehicle = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle + 1); if( !hActor ) return false; sSkillInfo.hSkillUser = hActor; hActor->ClearTriggerBuff(); if( hVehicle ) hVehicle->ClearTriggerBuff(); for( int itr = 0; itr < (int)vecSkillEffectList.size(); ++itr ) { int nID = hActor->CmdAddStateEffect( &sSkillInfo, (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID, nDelay, vecSkillEffectList[itr].szValue.c_str(), false, true ); hActor->AddTriggerBuff( nID ); if( hActor->IsPlayerActor() ) static_cast(hActor.GetPointer())->SendRemoveStateEffectGraphic( (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID ); if( hVehicle ) { nID = hVehicle->CmdAddStateEffect( &sSkillInfo, (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID, nDelay, vecSkillEffectList[itr].szValue.c_str(), false, true ); hVehicle->AddTriggerBuff( nID ); } } PROFILE_TICK_TEST_BLOCK_END(); return true; } void api_trigger_BuffFromEventArea( CDNGameRoom *pRoom, int nActorHandle, int nSkillID, int nSkillLevel, int nDelay) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_BuffFromEventArea" ); if( !pRoom ) return; CDnSkill::SkillInfo sSkillInfo; std::vector vecSkillEffectList; CDnSkill::CreateSkillInfo( nSkillID, nSkillLevel, sSkillInfo, vecSkillEffectList ); sSkillInfo.bIgnoreImmune = true; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); DnActorHandle hVehicle = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle + 1); if( !hActor ) return; sSkillInfo.hSkillUser = hActor; for( int itr = 0; itr < (int)vecSkillEffectList.size(); ++itr ) { hActor->CmdAddStateEffect( &sSkillInfo, (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID, nDelay, vecSkillEffectList[itr].szValue.c_str(), false, true ); if( hActor->IsPlayerActor() ) static_cast(hActor.GetPointer())->SendRemoveStateEffectGraphic( (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID ); if( hVehicle ) { hVehicle->CmdAddStateEffect( &sSkillInfo, (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID, nDelay, vecSkillEffectList[itr].szValue.c_str(), false, true ); } } PROFILE_TICK_TEST_BLOCK_END(); } void api_trigger_ActorBuffFromEventArea( CDNGameRoom *pRoom, int nActorHandle, int nEventAreaHandle, int nSkillID, int nSkillLevel, int nDelay, bool bSummonInclude ) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_ActorBuffFromEventArea" ); if( NULL == pRoom ) return; CDnSkill::SkillInfo sSkillInfo; std::vector vecSkillEffectList; CDnSkill::CreateSkillInfo( nSkillID, nSkillLevel, sSkillInfo, vecSkillEffectList ); sSkillInfo.bIgnoreImmune = true; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( NULL == hActor ) return; const std::list & listSummmonMonster = hActor->GetSummonedMonsterList(); for( int itr = 0; itr < (int)vecSkillEffectList.size(); ++itr ) { sSkillInfo.hSkillUser = hActor; hActor->CmdAddStateEffect( &sSkillInfo, (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID, nDelay, vecSkillEffectList[itr].szValue.c_str(), false, true ); if( bSummonInclude && false == listSummmonMonster.empty() ) { std::list::const_iterator iter = listSummmonMonster.begin(); for( iter; iter != listSummmonMonster.end(); ++iter ) { DnMonsterActorHandle hMonster = (*iter); if( NULL == hMonster && false == api_trigger_IsInsidePlayerToEventArea( pRoom, hMonster->GetClassID(), nEventAreaHandle) ) continue; sSkillInfo.hSkillUser = hMonster; hMonster->CmdAddStateEffect( &sSkillInfo, (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[itr].nID, nDelay, vecSkillEffectList[itr].szValue.c_str(), false, true ); } } } PROFILE_TICK_TEST_BLOCK_END(); } void api_trigger_Start_DragonNest( CDNGameRoom* pRoom, int nType, int nRebirthCount ) { if( !pRoom ) return; // ¼­¹öÂÊ¿¡µµ ¼³Á¤ÀÌ µÇ¾î¾ß ÇÒµí... [2011/01/12 semozz] CDnWorld *pWorld = pRoom->GetWorld(); if (pWorld) pWorld->SetDragonNestType((eDragonNestType)nType); for( UINT i=0 ; iGetUserCount() ; ++i ) { CDNUserSession* pUser = pRoom->GetUserData(i); if( pUser ) { // ¾¾µå·¡°ï³×½ºÆ®¿¡¼­ ºÎȰ Ä«¿îÆ® ¼ö´Â ÀÌ Á¤º¸°ªÀ¸·Î º¯°æÇÑ´Ù [2011/01/12 semozz] CDNGameRoom::PartyStruct* pParty = pRoom->GetPartyData(pUser); if (pParty) { pParty->nUsableRebirthCoin = nRebirthCount; } pUser->SendStartDragonNest( (eDragonNestType)nType, nRebirthCount ); } } } void api_trigger_SetUsableRebirthCoin( CDNGameRoom* pRoom, int nActorHandle, int nUsableRebirthCoin ) { if( !pRoom ) return; CDNUserSession* pSession = pRoom->GetUserSession(nActorHandle); if( pSession == NULL ) return; CDNGameRoom::PartyStruct* pStruct = pRoom->GetPartyData( pSession ); if( pStruct == NULL ) return; pStruct->nUsableRebirthCoin = nUsableRebirthCoin; pSession->SendRebirthCoin( ERROR_NONE, nUsableRebirthCoin, _REBIRTH_SELF, pSession->GetSessionID() ); } int api_trigger_GetMonsterHPPercent_FromEventArea( CDNGameRoom* pRoom, int nEventAreaHandle ) { if( !pRoom ) return -1; CDnGameTask* pGameTask = static_cast(pRoom->GetTaskMng()->GetTask("GameTask") ); if( !pGameTask ) return -1; return pGameTask->GetInsideAreaMonsterHPPercent( nEventAreaHandle ); } void api_trigger_UseSkillFromEventArea( CDNGameRoom *pRoom, int nEventAreaHandle, int nSkillID ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; DNVector(DnActorHandle) hVecList; pTask->GetBirthAreaLiveActors( nEventAreaHandle, hVecList ); for( DWORD i=0; iIsDie() ) continue; if( !hVecList[i]->IsMonsterActor() ) continue; CDnMonsterActor *pMonster = (CDnMonsterActor*)hVecList[i].GetPointer(); if (pMonster) { DnSkillHandle hSkill = pMonster->FindSkill(nSkillID); if (hSkill) hSkill->SetIgnoreImmnune(true); pMonster->UseSkill( nSkillID ); } } } void api_trigger_UseSkill( CDNGameRoom *pRoom, int nActorHandle, int nSkillID ) { if( !pRoom ) return; DnActorHandle hActor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !hActor ) return; if( hActor->IsDie() ) return; if( !hActor->IsMonsterActor() ) return; CDnMonsterActor *pMonster = (CDnMonsterActor*)hActor.GetPointer(); pMonster->UseSkill( nSkillID ); } void api_trigger_AllUser_AddVehicleItem(CDNGameRoom *pRoom, char* pszStr, bool bDBSave ) { if( pszStr == NULL ) return; std::string strString(pszStr); std::vector vSplit; std::vector vItemID; boost::algorithm::split( vSplit, strString, boost::algorithm::is_any_of(",") ); for( UINT i=0 ; iGetItemData( vItemID[i] ); if( pItemData == NULL ) { _ASSERT(0); return; } if( pItemData->nType != ITEMTYPE_VEHICLE ) { _ASSERT(0); return; } } if( vItemID.empty() ) return; ::srand( timeGetTime() ); for( DWORD i=0; iGetUserCount(); i++ ) { CDNUserSession *pSession = pRoom->GetUserData(i); if( !pSession ) continue; #if defined(PRE_ADD_RACING_MODE) if( pRoom->GetPvPGameMode() && !pRoom->GetPvPGameMode()->bIsPlayingUser(pSession->GetActorHandle()) ) continue; #endif int iItemID = vItemID[::rand()%vItemID.size()]; pSession->GetItem()->CreateCashInvenItem( iItemID, 1, bDBSave ? DBDNWorldDef::AddMaterializedItem::Trigger : 0 ); } } void api_trigger_PlayerNameShowBlindCaption( CDNGameRoom *pRoom, int nUIStringIndex, int nDelay, int nActorHandle ) { DnActorHandle Actor = CDnActor::FindActorFromUniqueID( pRoom, nActorHandle ); if( !Actor ) return; WCHAR wszString[512]; #if defined(PRE_ADD_MULTILANGUAGE) //ÀÌ°Ç ¸ÕÁö ¸ô°Ú´Ù CDNUserSession * pUser; for( DWORD itr = 0; itr < pRoom->GetUserCount(); ++itr ) { memset(wszString, 0, sizeof(wszString)); pUser = pRoom->GetUserData(itr); if( pUser ) { swprintf_s( wszString, _countof(wszString), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nUIStringIndex, pUser->m_eSelectedLanguage ), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, Actor->GetNameUIStringIndex(), pUser->m_eSelectedLanguage ) ); pUser->SendChat( eChatType::CHATTYPE_BLIND, _countof(wszString), L"", wszString ); } } #else //#if defined(PRE_ADD_MULTILANGUAGE) swprintf_s( wszString, _countof(wszString), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nUIStringIndex ), Actor->GetName() ); CDNUserSession * pUser; for( DWORD itr = 0; itr < pRoom->GetUserCount(); ++itr ) { pUser = pRoom->GetUserData(itr); if( pUser ) pUser->SendChat( eChatType::CHATTYPE_BLIND, _countof(wszString), L"", wszString ); } #endif //#if defined(PRE_ADD_MULTILANGUAGE) } void api_trigger_InvenToEquip( CDNGameRoom* pRoom, UINT nUserObjectID, int iItemID, bool bShootMode, bool bBackup/*=false*/ ) { CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return; const TItemData* pItemData = g_pDataManager->GetItemData( iItemID ); if( pItemData == NULL ) return; // Æ®¸®°Å·Î ij½ÃÅÛÀº ¸øÇÏ°Ô ÇÑ´Ù if( pItemData->IsCash ) return; int iInvenIndex = pUser->GetItem()->FindInventorySlot( iItemID, 1 ); if( iInvenIndex < 0 ) return; int iDestIndex = pUser->GetItem()->GetEquipSlotIndex( iItemID ); if( iDestIndex < 0 ) return; const TItem* pItem = pUser->GetItem()->GetInventory( iInvenIndex ); if( pItem == NULL ) return; CSMoveItem TxPacket; memset( &TxPacket, 0, sizeof(TxPacket) ); TxPacket.cMoveType = MoveType_InvenToEquip; TxPacket.cSrcIndex = static_cast(iInvenIndex); TxPacket.biSrcItemSerial = pItem->nSerial; TxPacket.cDestIndex = static_cast(iDestIndex); TxPacket.wCount = 1; if( bBackup == true ) { const TItem* pOrgEquip = pUser->GetItem()->GetEquip( TxPacket.cDestIndex ); // ÀÌ¹Ì ¹é¾÷¼³Á¤ÀÌ µÇ¾úÀ¸¸é if( pUser->m_BackupEquipInfo.first == 0 ) pUser->m_BackupEquipInfo = std::make_pair( pOrgEquip?pOrgEquip->nSerial:0, pItem->nSerial ); else pUser->m_BackupEquipInfo.second = pItem->nSerial; } else { pUser->m_BackupEquipInfo = std::make_pair(0,0); } DnActorHandle hActor = pUser->GetActorHandle(); if( hActor && hActor->IsPlayerActor() ) { CDnPlayerActor *pPlayer = static_cast(hActor.GetPointer()); if( pPlayer ) { pPlayer->SetWeaponViewOrder( 0, false ); pUser->GetItem()->SetMoveItemCheckGameMode( false ); pRoom->OnDispatchMessage( pUser, CS_ITEM, eItem::CS_MOVEITEM, reinterpret_cast(&TxPacket), sizeof(TxPacket), 0 ); pUser->GetItem()->SetMoveItemCheckGameMode( true ); // ShootMode const TItem* pEquip = pUser->GetItem()->GetEquip( TxPacket.cDestIndex ); if( pEquip && pEquip->nItemID == iItemID ) { pPlayer->CmdShootMode( bShootMode ); } } } } void api_trigger_UnRideVehicle( CDNGameRoom* pRoom, UINT nUserObjectID ) { if( !pRoom ) return; CDNUserSession* pSession = pRoom->GetUserSession(nUserObjectID); if( pSession == NULL ) return; TVehicle* pVehicle = pSession->GetItem()->GetVehicleEquip(); if( pVehicle == NULL ) return; CSMoveCashItem TxPacket; memset( &TxPacket, 0, sizeof(TxPacket) ); TxPacket.cMoveType = MoveType_VehicleBodyToVehicleInven; TxPacket.cCashEquipIndex = Vehicle::Slot::Body; TxPacket.biEquipItemSerial = pVehicle->Vehicle[Vehicle::Slot::Body].nSerial; TxPacket.biCashInvenSerial = 0; TxPacket.wCount = 1; pRoom->OnDispatchMessage( pSession, CS_ITEM, eItem::CS_MOVECASHITEM, reinterpret_cast(&TxPacket), sizeof(TxPacket), 0 ); } void api_trigger_ChangeMyBGM( CDNGameRoom * pRoom, int nActorHandle, int nBGM, int nFadeDelta ) { CDNUserSession* pSession = pRoom->GetUserSession(nActorHandle); if( pSession == NULL ) return; pSession->SendTriggerChangeMyBGM(nBGM, nFadeDelta); } void api_trigger_FileTableBGMOff( CDNGameRoom * pRoom, int nActorHandle ) { if( !pRoom ) return; CDNUserSession* pSession = pRoom->GetUserSession(nActorHandle); if( pSession == NULL ) return; pSession->SendTriggerFileTableBGMOff(); } void api_trigger_RadioMsg( CDNGameRoom * pRoom, int nActorHandle, int nRadioID ) { CDNUserSession* pSession = pRoom->GetUserSession(nActorHandle); if( pSession == NULL ) return; pSession->SendUseRadio(nActorHandle, nRadioID); } void api_trigger_RadioImage( CDNGameRoom * pRoom, int nActorHandle, int nFileID, DWORD nTime ) { CDNUserSession* pSession = pRoom->GetUserSession(nActorHandle); if( pSession == NULL ) return; for( DWORD i=0; iGetUserCount(); i++ ) { pSession = pRoom->GetUserData(i); if( pSession ) pSession->SendTriggerRadioImage( nActorHandle, nFileID, nTime ); } } int api_trigger_GetPvPGameModePlayTime( CDNGameRoom * pRoom ) { if( !pRoom ) return 0; if( !pRoom->GetPvPGameMode() ) return 0; return static_cast(pRoom->GetPvPGameMode()->GetSelectPlayTime() - pRoom->GetPvPGameMode()->GetTimeOver()); } void api_trigger_TargetActorShowNpc( CDNGameRoom * pRoom, int nActorHandle, int nEventAreaHandle, bool bShow ) { if( !pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; CDNUserSession * pSession = pRoom->GetUserSession( nActorHandle ); if( !pSession ) return; DNVector(DnActorHandle) vecActor; pTask->GetBirthAreaLiveActors( nEventAreaHandle, vecActor ); if( vecActor.empty() ) return; if (bShow) { std::vector VecArea; pRoom->GetWorld()->FindEventAreaFromCreateUniqueID( nEventAreaHandle, &VecArea ); if( VecArea.empty() ) return; EtVector3 vPos; CEtWorldEventArea* pArea = VecArea[0]; for ( int itr = 0 ; itr < (int)vecActor.size() ; ++itr ) { DnActorHandle hActor = vecActor[itr]; if( !hActor ) continue; if (!hActor->IsNpcActor()) continue; hActor->Show(true); pTask->SendActorShow(pSession, hActor); } } else { for ( int itr = 0 ; itr < (int)vecActor.size() ; ++itr ) { DnActorHandle hActor = vecActor[itr]; if( !hActor ) continue; if (!hActor->IsNpcActor()) continue; hActor->Show(false); pTask->SendActorHide(pSession, hActor); } } } void api_trigger_TargetActorShowProp( CDNGameRoom * pRoom, int nActorHandle, int nPropHandle, bool bShow ) { if(!pRoom) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( !pTask ) return; CDNUserSession * pSession = pRoom->GetUserSession( nActorHandle ); if( !pSession ) return; std::vector pVecList; CDnWorld::GetInstance(pRoom).FindPropFromCreateUniqueID( nPropHandle, &pVecList ); if( pVecList.empty() ) return; for( DWORD i=0; iGetPropType() != PTE_Npc ) continue; pProp->CmdShow (bShow, pSession); } } int api_trigger_TriggerVariableTable( CDNGameRoom * pRoom, int nItemID ) { if( !pRoom ) return -1; DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TTRIGGERVARIABLETABLE ); if( !pSox ) return -1; return pSox->GetFieldFromLablePtr( nItemID, "_Value" )->GetInteger(); } int api_trigger_GetPvPGameMode( CDNGameRoom * pRoom ) { if( !pRoom || !pRoom->GetPvPGameMode() || !pRoom->GetPvPGameMode()->GetPvPGameModeTable() ) return -1; return pRoom->GetPvPGameMode()->GetPvPGameModeTable()->uiGameMode; } void api_trigger_CmdKeepOperationProp( CDNGameRoom * pRoom, int nPropHandle, int nActorHandle, int nOperationTime, int nStringID, const char *szAction ) { if( NULL == pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( NULL == pTask ) return; CDNUserSession * pSession = pRoom->GetUserSession( nActorHandle ); if( NULL == pSession ) return; std::vector pVecList; CDnWorld::GetInstance(pRoom).FindPropFromCreateUniqueID( nPropHandle, &pVecList ); if( pVecList.empty() ) return; for( DWORD i=0; iGetPropType() != PTE_KeepOperation ) continue; // ¿©±â¼­ ÇÁ¶ø ½ÇÇà ½ÃÀÛ ¾Ë·ÁÁÖ½Ã¸é µË´Ï´Ù. pProp->OnClickKeepProp( pSession, nOperationTime, nStringID, szAction ); } return; } void api_trigger_ActivateMission( CDNGameRoom * pRoom, int nActorHandle, int nMissionID) { if( NULL == pRoom ) return; CDnGameTask *pTask = (CDnGameTask *)pRoom->GetTaskMng()->GetTask( "GameTask" ); if( NULL == pTask ) return; CDNUserSession * pSession = pRoom->GetUserSession( nActorHandle ); if( NULL == pSession ) return; pSession->GetEventSystem()->OnEvent(EventSystem::OnTrigger, 1, EventSystem::MissionID, nMissionID); } void api_trigger_SetDungeonClearRound( CDNGameRoom * pRoom, int iRound ) { #if defined( PRE_ADD_36870 ) if( pRoom == NULL ) return; pRoom->SetDungeonClearRound( iRound ); #endif // #if defined( PRE_ADD_36870 ) return; } bool api_trigger_BreakIntoUserCheck( CDNGameRoom* pRoom ) { if( !pRoom ) return false; return !pRoom->bIsExistBreakIntoUser(); } bool api_trigger_DungeonStartTimeAttack( CDNGameRoom* pRoom, int iMin, int iSec ) { if( !pRoom ) return false; CDnGameTask* pGameTask = pRoom->GetGameTask(); if( !pGameTask ) return false; pGameTask->StartTimeAttack( iMin, iSec ); pGameTask->SyncTimeAttack(); return true; } int api_trigger_DungeonCheckTimeAttack( CDNGameRoom* pRoom ) { if( !pRoom ) return 0; CDnGameTask* pGameTask = pRoom->GetGameTask(); if( !pGameTask ) return 0; return pGameTask->GetRemainTimeAttackSec(); } void api_trigger_DungeonStopTimeAttack( CDNGameRoom* pRoom ) { if( !pRoom ) return; CDnGameTask* pGameTask = pRoom->GetGameTask(); if( !pGameTask ) return; pGameTask->StopTimeAttack(); } void api_trigger_RequestDungeonFail( CDNGameRoom* pRoom, bool bTimeOut/*=false*/ ) { if( !pRoom ) return; CDnGameTask* pGameTask = pRoom->GetGameTask(); if( pGameTask == NULL ) return; pGameTask->RequestDungeonFailed(true,bTimeOut); } void api_trigger_Special_RebirthItem( CDNGameRoom* pRoom, int nType, int nITemID, int nRebirthItemCount ) { if( !pRoom ) return; CDnWorld *pWorld = pRoom->GetWorld(); if (pWorld) pWorld->SetDragonNestType((eDragonNestType)nType); // ºÎȰ ¾ÆÀÌÅÛ°ú Ƚ¼ö ÁöÁ¤ for( UINT i=0 ; iGetUserCount() ; ++i ) { CDNUserSession* pUser = pRoom->GetUserData(i); if( pUser ) { CDNGameRoom::PartyStruct* pParty = pRoom->GetPartyData(pUser); int nRebirthCount = 0; if (pParty) { nRebirthCount = pParty->nUsableRebirthCoin; pParty->ReverseItemList.push_back( nITemID ); pParty->nUsableRebirthItemCoin += nRebirthItemCount; } pUser->SendStartDragonNest( (eDragonNestType)nType, nRebirthCount ); pUser->SendSpecialRebirthItem( nITemID, pParty->nUsableRebirthItemCoin ); } } } void api_trigger_GameWarpDungeonClearToLeader(CDNGameRoom* pRoom, bool bIgnoreClear/*=false*/) { if (!pRoom) return; CDnGameTask* pGameTask = pRoom->GetGameTask(); if (!pGameTask) return; if (!bIgnoreClear) { pRoom->AddDungeonPlayTime( timeGetTime() - pGameTask->GetStageCreateTime() ); for( DWORD i=0; iGetUserCount(); i++ ) { // StageClear ·Î±× CDNGameRoom::PartyStruct* pParty = pRoom->GetPartyData(i); if (pParty && pParty->pSession) { pParty->pSession->SetLastStageClearRank(0); pParty->pSession->CheckAndSendStageClearLog(true); } } } pGameTask->EnableGameWarpDungeonClearToLeader(); pGameTask->SendGameWarpDungeonClearToLeader(); } void api_trigger_console_WriteLine( char * szOutputString, const char * s0, const char * s1, const char * s2, const char * s3, const char * s4, const char * s5, const char * s6, const char * s7, const char * s8, const char * s9 ) { #if defined(_WORK) if( NULL == szOutputString || NULL == s0 || NULL == s1 || NULL == s2 || NULL == s3 || NULL == s4 || NULL == s5 || NULL == s6 || NULL == s7 || NULL == s8 || NULL == s9 ) return; char szPrintString[512] = {0,}; sprintf_s( szPrintString, _countof( szPrintString ), szOutputString, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9 ); g_Log.Log( LogType::_NORMAL, szPrintString ); #endif } int api_trigger_GetPartyCountbyRoom( CDNGameRoom* pRoom ) { #if defined( PRE_FIX_49129 ) if (!pRoom) return 0; return pRoom->GetFirstUserCount(); #else return 0; #endif } int api_trigger_GetPartyActorbyRoom( CDNGameRoom* pRoom, int nFirstPartyIndex ) { #if defined( PRE_FIX_49129 ) if (!pRoom) return 0; if( nFirstPartyIndex >= (int)(pRoom->GetFirstUserCount()) ) return 0; CDNGameRoom::PartyFirstStruct* PartyFirst = pRoom->GetFirstPartyData((DWORD)nFirstPartyIndex); if( !PartyFirst ) return 0; CDNUserSession * pSession = pRoom->GetUserSessionByCharDBID( PartyFirst->biCharacterDBID ); if( NULL == pSession ) return 0; return pSession->GetSessionID(); #else return 0; #endif } // ¸ðµç À¯ÀúÀÇ Ãâ¹ß ½Ã°£ ±â·Ï.. int api_trigger_GetRacingStartTime( CDNGameRoom * pRoom ) { if( !pRoom ) return 0; if( !pRoom->GetPvPGameMode()->bIsRacingMode() ) return 0; #if defined(PRE_ADD_RACING_MODE) pRoom->GetPvPGameMode()->SetRacingStart(); #endif return 0; } int api_trigger_GetRacingGoalTime( CDNGameRoom * pRoom, const int nActorHandle ) { if( !pRoom ) return 0; if( !pRoom->GetPvPGameMode()->bIsRacingMode() ) return 0; CDNUserSession * pSession = pRoom->GetUserSession( (UINT)nActorHandle ); if( !pSession ) return 0; #if defined(PRE_ADD_RACING_MODE) pRoom->GetPvPGameMode()->SetRacingEnd( (UINT)nActorHandle ); #endif return 0; } int api_trigger_GetCurrentWeather( CDNGameRoom* pRoom ) { #if defined (PRE_ADD_DESERTDRAGON) if (!pRoom || !pRoom->GetWorld()) return -1; return pRoom->GetWorld()->GetCurrentWeather(); #else return -1; #endif } void api_trigger_StartDungeonGateTime( CDNGameRoom* pRoom, int nGateID ) { #if defined( PRE_ADD_58761 ) if (!pRoom) return; return pRoom->StartDungeonGateTime( nGateID ); #endif } void api_trigger_EndDungeonGateTime( CDNGameRoom* pRoom, int nGateID ) { #if defined( PRE_ADD_58761 ) if (!pRoom) return; return pRoom->EndDungeonGateTime( nGateID, true ); #endif } int api_trigger_StageRemainClearCount( CDNGameRoom* pRoom, UINT nUserObjectID, int nMapIndex ) { #if defined(PRE_ADD_62072) if (!pRoom) return 0; CDNUserSession * pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return 0; int nMapID = nMapIndex; const TMapInfo *pMapInfo = g_pDataManager->GetMapInfo(nMapID); if(!pMapInfo) return 0; int nExpandNestClearCount = 0; int nPCBangExpandNestClearCount = 0; if ( pMapInfo->MapSubType == EWorldEnum::MapSubTypeNest && pMapInfo->bExpandable){ nExpandNestClearCount = pUser->m_nExpandNestClearCount; nPCBangExpandNestClearCount = g_pDataManager->GetPCBangNestClearCount(pUser->GetPCBangGrade(), nMapID); } int nRemainCount = (pMapInfo->nMaxClearCount + nExpandNestClearCount + nPCBangExpandNestClearCount) - pUser->GetNestClearTotalCount( nMapID ); if( nRemainCount < 0 ) return 0; return nRemainCount; #endif return 0; } void api_trigger_EnableRideVehicle( CDNGameRoom * pRoom, UINT nActorHandle, bool bEnableRide ) { if( !pRoom ) return; CDNUserSession * pUser = pRoom->GetUserSession( nActorHandle ); if ( !pUser ) return; CDnPlayerActor * pPlayerActor = pUser->GetPlayerActor(); if( !pPlayerActor ) return; pPlayerActor->SetForceEnableRide( bEnableRide ); } void api_trigger_AllMonsterUseSkill( CDNGameRoom * pRoom, int nSkillID, int nSkillLevel, int nDelay, bool bEternity ) { PROFILE_TICK_TEST_BLOCK_START( "api_trigger_AllMonsterUseSkill" ); if( !pRoom ) return; CDnSkill::SkillInfo sSkillInfo; std::vector vecSkillEffectList; CDnSkill::CreateSkillInfo( nSkillID, nSkillLevel, sSkillInfo, vecSkillEffectList ); sSkillInfo.bIgnoreImmune = true; DNVector(DnActorHandle) vecActorList; CDnActor::GetActorList( pRoom, vecActorList ); for( DWORD itr = 0; itr < vecActorList.size(); ++itr ) { DnActorHandle hActor = vecActorList[itr]; if( !hActor || hActor->IsDie() || !hActor->IsMonsterActor() ) continue; DnMonsterActorHandle hMonsterActor = hActor; if( !hMonsterActor || hMonsterActor->GetSummonerPlayerActor() ) continue; sSkillInfo.hSkillUser = hActor; for( int nEffectIndex = 0; nEffectIndex < (int)vecSkillEffectList.size(); ++nEffectIndex ) { hActor->CmdAddStateEffect( &sSkillInfo, (STATE_BLOW::emBLOW_INDEX)vecSkillEffectList[nEffectIndex].nID, nDelay, vecSkillEffectList[nEffectIndex].szValue.c_str(), false, true, bEternity ); } } PROFILE_TICK_TEST_BLOCK_END(); } bool api_trigger_RequireTotalComboCount( CDNGameRoom * pRoom, UINT nActorHandle, int nTotalComboCount ) { if( NULL == pRoom ) return false; CDNUserSession* pSession = pRoom->GetUserSession( nActorHandle ); if( NULL == pSession ) return false; CDnPlayerActor * pPlayer = pSession->GetPlayerActor(); if( NULL == pPlayer ) return false; if( pPlayer->GetTotalComboCount() >= nTotalComboCount ) return true; return false; } void api_trigger_RequireTotalComboReset( CDNGameRoom * pRoom, UINT nActorHandle ) { if( NULL == pRoom ) return; CDNUserSession* pSession = pRoom->GetUserSession( nActorHandle ); if( NULL == pSession ) return; CDnPlayerActor * pPlayer = pSession->GetPlayerActor(); if( NULL == pPlayer ) return; pPlayer->ResetTotalComboCount(); } int api_trigger_GetPartyInClassCount( CDNGameRoom* pRoom, int nClassID ) { if( NULL == pRoom ) return 0; return pRoom->GetPartyUserClassCount(nClassID); } void api_trigger_Set_AlteiaWorld( CDNGameRoom* pRoom, bool bFlag ) { #if defined( PRE_ALTEIAWORLD_EXPLORE ) if( NULL == pRoom ) return; pRoom->SetAlteiaWorld(bFlag); #endif return; } #if defined(PRE_ADD_OPEN_QUEST_TEXTURE_DIALOG) int api_ui_OpenTextureDialog(CDNGameRoom* pRoom, UINT nUserObjectID, int nFileIndex, float fX, float fY, int nPos, int nTime, int nDialogIndex, bool bAutoCloseDialog) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; SCOpenTextureDialog sDlgData; sDlgData.fX = fX; sDlgData.fY = fY; sDlgData.nTime = nTime; sDlgData.nPosition = nPos; sDlgData.nFileIndex = nFileIndex; sDlgData.nDialogIndex = nDialogIndex; sDlgData.bAutoCloseDialog = bAutoCloseDialog; return DNScriptAPI::api_Open_Texture_Dialog(pUser, sDlgData); } int api_ui_CloseTextureDialog(CDNGameRoom* pRoom, UINT nUserObjectID, int nDlgID) { DN_ASSERT(NULL != pRoom, "Invalid!"); CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if ( !pUser ) return -1; return DNScriptAPI::api_Close_Texture_Dialog(pUser, nDlgID); } #endif void api_tirgger_Set_UserHPSP( CDNGameRoom * pRoom, UINT nActorHandle, int nHP_Ratio, int nSP_Ratio ) { if( NULL == pRoom ) return; CDNUserSession* pSession = pRoom->GetUserSession( nActorHandle ); if( NULL == pSession ) return; CDnPlayerActor * pPlayer = pSession->GetPlayerActor(); if( NULL == pPlayer ) return; INT64 nHP = (INT64)( pPlayer->GetMaxHP() *( nHP_Ratio / 100.f ) ); if( nHP > pPlayer->GetMaxHP() ) nHP = pPlayer->GetMaxHP(); else if( nHP < 1 ) nHP = 1; int nSP = (int)( pPlayer->GetMaxSP() *( nSP_Ratio / 100.f ) ); if( nSP > pPlayer->GetMaxSP() ) nSP = pPlayer->GetMaxSP(); else if( nSP < 1 ) nSP = 1; pPlayer->CmdRefreshHPSP( nHP, nSP ); } void api_trigger_Set_ItemUseCount( CDNGameRoom* pRoom, int nItemID, int nUseCount ) { #if defined( PRE_ADD_STAGE_USECOUNT_ITEM ) if( !pRoom ) return; for( UINT i=0 ; iGetUserCount() ; ++i ) { CDNUserSession* pUser = pRoom->GetUserData(i); if( pUser ) { CDNGameRoom::PartyStruct* pParty = pRoom->GetPartyData(pUser); if (pParty) { pParty->UseLimitItem.insert(make_pair(nItemID, nUseCount)); } pUser->SendStageUseLimitItem( nItemID, nUseCount ); } } #endif } //rlkt_test bool api_trigger_CheckJobChangeProcess(CDNGameRoom* pRoom, UINT nActorHandle) { if (!pRoom) return false; //rlkt_placeholder! return true; } int api_ui_OpenJobChange(CDNGameRoom* pRoom, UINT nUserObjectID) { if (!pRoom) return false; CDNUserSession* pUser = pRoom->GetUserSession(nUserObjectID); if (!pUser) return -1; return DNScriptAPI::api_Open_ChangeJobDialog(pUser); //(pRoom, nUserObjectID); } int api_trigger_Emergence_Begin(CDNGameRoom* pRoom, int nEventAreaHandle) { return 1; } int api_trigger_Emergence_GetValue(CDNGameRoom* pRoom, UINT nValueType) { //OutputDebug("%s nValueType:%d", __FUNCTION__, nValueType); //rlkt_placeholder. if(nValueType == 1) { return 0; } return 0; } bool api_trigger_Emergence_CheckSelectedEvent(CDNGameRoom* pRoom, int nEventAreaHandle) { return false; } bool api_trigger_CheckForceMoveComebackRoom(CDNGameRoom* pRoom) { return false; }