-
Posts
408 -
Joined
-
Last visited
-
Days Won
1 -
Feedback
0%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by Traceur3RUN
-
-
Version of Files : XXX
[[ Hi / Hello / Hey... ]]
[[ It is a template to help you with your problem... ]]
1. Description of the problem / Question :
spider dungeon2, bug graphics black screen
2. SysErr ( Client / Server ) / SysLog ( Server )
Spoiler0531 19:33:30081 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\000000\height.raw OPEN ERROR
0531 19:33:30084 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\000000\attr.atr OPEN ERROR
0531 19:33:30084 :: CMapOutdoor::LoadTerrain(0, 0) LoadAttrMap ERROR
0531 19:33:30085 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\000000\tile.raw OPEN ERROR
0531 19:33:30086 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30087 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\000000\shadowmap.raw OPEN ERROR
0531 19:33:30087 :: CMapOutdoor::LoadTerrain(0, 0) LoadShadowMap ERROR
0531 19:33:30092 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\001000\height.raw OPEN ERROR
0531 19:33:30095 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\001000\attr.atr OPEN ERROR
0531 19:33:30095 :: CMapOutdoor::LoadTerrain(1, 0) LoadAttrMap ERROR
0531 19:33:30095 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\001000\tile.raw OPEN ERROR
0531 19:33:30097 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30098 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\001000\shadowmap.raw OPEN ERROR
0531 19:33:30098 :: CMapOutdoor::LoadTerrain(1, 0) LoadShadowMap ERROR
0531 19:33:30103 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\002000\height.raw OPEN ERROR
0531 19:33:30106 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\002000\attr.atr OPEN ERROR
0531 19:33:30106 :: CMapOutdoor::LoadTerrain(2, 0) LoadAttrMap ERROR
0531 19:33:30106 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\002000\tile.raw OPEN ERROR
0531 19:33:30108 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30108 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\002000\shadowmap.raw OPEN ERROR
0531 19:33:30108 :: CMapOutdoor::LoadTerrain(2, 0) LoadShadowMap ERROR
0531 19:33:30113 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\000001\height.raw OPEN ERROR
0531 19:33:30116 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\000001\attr.atr OPEN ERROR
0531 19:33:30116 :: CMapOutdoor::LoadTerrain(0, 1) LoadAttrMap ERROR
0531 19:33:30116 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\000001\tile.raw OPEN ERROR
0531 19:33:30118 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30118 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\000001\shadowmap.raw OPEN ERROR
0531 19:33:30118 :: CMapOutdoor::LoadTerrain(0, 1) LoadShadowMap ERROR
0531 19:33:30263 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\001001\height.raw OPEN ERROR
0531 19:33:30266 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\001001\attr.atr OPEN ERROR
0531 19:33:30266 :: CMapOutdoor::LoadTerrain(1, 1) LoadAttrMap ERROR
0531 19:33:30266 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\001001\tile.raw OPEN ERROR
0531 19:33:30268 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30268 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\001001\shadowmap.raw OPEN ERROR
0531 19:33:30268 :: CMapOutdoor::LoadTerrain(1, 1) LoadShadowMap ERROR
0531 19:33:30327 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 00531 19:33:30327 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30327 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30327 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30330 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\002001\height.raw OPEN ERROR
0531 19:33:30333 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\002001\attr.atr OPEN ERROR
0531 19:33:30333 :: CMapOutdoor::LoadTerrain(2, 1) LoadAttrMap ERROR
0531 19:33:30333 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\002001\tile.raw OPEN ERROR
0531 19:33:30335 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30335 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\002001\shadowmap.raw OPEN ERROR
0531 19:33:30335 :: CMapOutdoor::LoadTerrain(2, 1) LoadShadowMap ERROR
0531 19:33:30341 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\000002\height.raw OPEN ERROR
0531 19:33:30344 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\000002\attr.atr OPEN ERROR
0531 19:33:30344 :: CMapOutdoor::LoadTerrain(0, 2) LoadAttrMap ERROR
0531 19:33:30345 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\000002\tile.raw OPEN ERROR
0531 19:33:30346 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30347 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\000002\shadowmap.raw OPEN ERROR
0531 19:33:30347 :: CMapOutdoor::LoadTerrain(0, 2) LoadShadowMap ERROR
0531 19:33:30355 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\001002\height.raw OPEN ERROR
0531 19:33:30358 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\001002\attr.atr OPEN ERROR
0531 19:33:30358 :: CMapOutdoor::LoadTerrain(1, 2) LoadAttrMap ERROR
0531 19:33:30358 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\001002\tile.raw OPEN ERROR
0531 19:33:30360 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30360 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\001002\shadowmap.raw OPEN ERROR
0531 19:33:30360 :: CMapOutdoor::LoadTerrain(1, 2) LoadShadowMap ERROR
0531 19:33:30368 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 00531 19:33:30368 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30368 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30368 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30368 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30368 :: CDungeonBlock::Load(filename=d:/ymir work/zone/dungeon/spider_dungeon/spider_dungeon03.gr2) - model count is 0
0531 19:33:30370 :: CTerrainImpl::LoadHeightMap - metin2_map_spiderdungeon_02\002002\height.raw OPEN ERROR
0531 19:33:30373 :: CTerrainImpl::LoadAttrMap - metin2_map_spiderdungeon_02\002002\attr.atr OPEN ERROR
0531 19:33:30373 :: CMapOutdoor::LoadTerrain(2, 2) LoadAttrMap ERROR
0531 19:33:30373 :: CTerrainImpl::RAW_LoadTileMap - metin2_map_spiderdungeon_02\002002\tile.raw OPEN ERROR
0531 19:33:30375 :: CTerrain::LoadShadowTexture - ShadowTexture is Empty
0531 19:33:30375 :: CTerrain::LoadShadowMap - metin2_map_spiderdungeon_02\002002\shadowmap.raw OPEN ERROR
0531 19:33:30375 :: CMapOutdoor::LoadTerrain(2, 2) LoadShadowMap ERROR
3. How to reproduce it ?
[[ Explain to us, how do you do it ? ]]
4. Screenshots ?
[[ A picture is worth more than a thousand words... ]]
Thanks, Sincerly,
[[ Username ]] -
hello, its possible to give player a exp percent not exp in value?
like pc.give_exp(50%) -
#solved
-
hello, sometimes my server looks like closed.
all channels and game + db are runningbut when i try connect i got this message:
"Server is not open yet"
auth: sysser
ChildLoop: AsyncSQL: query failed: Table 'account.messenger_list' doesn't exist (query: SELECT account, companion FROM messenger_list WHERE account='' errno: 1146)
Analyze: Accept shutdown p2p command from 62.210.77.54.
someone have know how i can fix it? -
15 godzin temu, displayjokes napisał:
To fix the position it's easy:
{"index":COSTUME_START_INDEX+2, "x":13, "y":126, "width":32, "height":32},#마운트 {"index":COSTUME_START_INDEX+3, "x":62, "y":126, "width":32, "height":32},#악세서리
on this too, just change the "x" with the other.
About summoning the mount when you use it, you will need to search when you use the item and equip it, the part where it's calling the mount you can have done something wrong.
It could also be something with the riding quests if you do not have the mount like horse system.
i added full code after channge to main post, everything is 1:1 to this tutorial
can you help me? i use the same quest from this thread.
-
Bug:
and when i equip it i need warp to another map or change character and again enter to game to see mount.
-
Hello, i added this mount system:
but i have a problem, because i have
mount on slot sash and sash on mount.
#2 bug is when i equip mount they don't summoned. only when i change character or change map mount is summoned
Client Binary:
GameLib/ItemData.h
Spoilerenum ECostumeSubTypes{ COSTUME_BODY, //0 갑옷(main look) COSTUME_HAIR, //1 헤어(탈착가능) COSTUME_ACCE, //2 COSTUME_MOUNT, //3 COSTUME_WEAPON, //4 COSTUME_NUM_TYPES };
UserInterface/GameType.h
Spoiler#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM const DWORD c_New_Equipment_Start = c_Equipment_Start + 24; const DWORD c_New_Equipment_Count = 3; const DWORD c_Equipment_Ring1 = c_New_Equipment_Start + 0;//0 const DWORD c_Equipment_Ring2 = c_New_Equipment_Start + 1;//1 const DWORD c_Equipment_Belt = c_New_Equipment_Start + 2;//2 #endif #ifdef ENABLE_COSTUME_SYSTEM const DWORD c_Costume_Slot_Start = c_Equipment_Start + 19; // [주의] 숫자(19) 하드코딩 주의. 현재 서버에서 코스츔 슬롯은 19부터임. 서버 common/length.h 파일의 EWearPositions 열거형 참고. const DWORD c_Costume_Slot_Body = c_Costume_Slot_Start + 0; const DWORD c_Costume_Slot_Hair = c_Costume_Slot_Start + 1; const DWORD c_Costume_Slot_Sash = c_Costume_Slot_Start + 2; const DWORD c_Costume_Slot_Mount = c_Costume_Slot_Start + 3; const DWORD c_Costume_Slot_Weapon = c_Costume_Slot_Start + 4; const DWORD c_Costume_Slot_Count = 5; const DWORD c_Costume_Slot_End = c_Costume_Slot_Start + c_Costume_Slot_Count; #endif
UserInterface/PythonItemModule.cpp
Spoiler// Item Sub Type PyModule_AddIntConstant(poModule, "COSTUME_TYPE_BODY", CItemData::COSTUME_BODY); PyModule_AddIntConstant(poModule, "COSTUME_TYPE_HAIR", CItemData::COSTUME_HAIR); PyModule_AddIntConstant(poModule, "COSTUME_TYPE_ACCE", CItemData::COSTUME_ACCE); PyModule_AddIntConstant(poModule, "COSTUME_TYPE_MOUNT", CItemData::COSTUME_MOUNT); PyModule_AddIntConstant(poModule, "COSTUME_TYPE_WEAPON", CItemData::COSTUME_WEAPON); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_START", c_Costume_Slot_Start); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_COUNT", c_Costume_Slot_Count); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_BODY", c_Costume_Slot_Body); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_HAIR", c_Costume_Slot_Hair); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_SASH", c_Costume_Slot_Sash); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_MOUNT", c_Costume_Slot_Mount); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_WEAPON", c_Costume_Slot_Weapon); PyModule_AddIntConstant(poModule, "COSTUME_SLOT_END", c_Costume_Slot_End);
Server:
common/item_lenght.h
Spoilerenum ECostumeSubTypes { COSTUME_BODY = ARMOR_BODY, // [중요!!] ECostumeSubTypes enum value는 종류별로 EArmorSubTypes의 그것과 같아야 함. COSTUME_HAIR = ARMOR_HEAD, // 이는 코스츔 아이템에 추가 속성을 붙이겠다는 사업부의 요청에 따라서 기존 로직을 활용하기 위함임. #ifdef __SASH_SYSTEM__ COSTUME_ACCE, #endif #ifdef ENABLE_COSTUME_MOUNT_SYSTEM COSTUME_MOUNT, #endif COSTUME_WEAPON, COSTUME_NUM_TYPES, };
common/length.h
Spoilerenum EWearPositions { WEAR_BODY, // 0 WEAR_HEAD, // 1 WEAR_FOOTS, // 2 WEAR_WRIST, // 3 WEAR_WEAPON, // 4 WEAR_NECK, // 5 WEAR_EAR, // 6 WEAR_UNIQUE1, // 7 WEAR_UNIQUE2, // 8 WEAR_ARROW, // 9 WEAR_SHIELD, // 10 WEAR_ABILITY1, // 11 WEAR_ABILITY2, // 12 WEAR_ABILITY3, // 13 WEAR_ABILITY4, // 14 WEAR_ABILITY5, // 15 WEAR_ABILITY6, // 16 WEAR_ABILITY7, // 17 WEAR_ABILITY8, // 18 WEAR_COSTUME_BODY, // 19 WEAR_COSTUME_HAIR, // 20 WEAR_COSTUME_SASH, //21 WEAR_COSTUME_MOUNT, // 22 WEAR_COSTUME_WEAPON,// 23 WEAR_RING1, // 24 : 신규 반지슬롯1 (왼쪽) WEAR_RING2, // 25 : 신규 반지슬롯2 (오른쪽) WEAR_BELT, // 26 : 신규 벨트슬롯 WEAR_MAX = 32 // };
DB:
ProtoReader.cpp
Spoilerstatic string arSub28[] = { "COSTUME_BODY", "COSTUME_HAIR", #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT "COSTUME_ACCE", "COSTUME_MOUNT", "COSTUME_WEAPON" #endif }; string arWearrFlag[] = { "WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE", "WEAR_ARROW", #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT "WEAR_HAIR", "WEAR_ABILITY", "WEAR_PENDANT", "WEAR_COSTUME_BODY", "WEAR_COSTUME_HAIR", "WEAR_COSTUME_SASH", "WEAR_COSTUME_MOUNT", "WEAR_COSTUME_WEAPON" #endif };
Game:
char_battle.cpp
Spoilervoid CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead) { if (IsDead()) return; { if (IsHorseRiding()) { StopRiding(); } else if (GetMountVnum()) { RemoveAffect(AFFECT_MOUNT_BONUS); UpdatePacket(); } }
char_item.cpp
Spoiler#ifdef __SASH_SYSTEM__ else if ((item->GetType() == ITEM_COSTUME) && (item->GetSubType() == COSTUME_ACCE)) this->EffectPacket(SE_EFFECT_SASH_EQUIP); #endif if (UNIQUE_SPECIAL_RIDE == item->GetSubType() && IS_SET(item->GetFlag(), ITEM_FLAG_QUEST_USE)) { quest::CQuestManager::instance().UseItem(GetPlayerID(), item, false); } #ifdef ENABLE_COSTUME_MOUNT_SYSTEM if (COSTUME_MOUNT == item->GetSubType()) { quest::CQuestManager::instance().UseItem(GetPlayerID(), item, false); } #endif case POINT_COSTUME_ATTR_BONUS: { #ifdef ENABLE_COSTUME_MOUNT_SYSTEM static BYTE abSlot[] = { WEAR_COSTUME_BODY, WEAR_COSTUME_HAIR, WEAR_COSTUME_SASH, WEAR_COSTUME_MOUNT }; #else static BYTE abSlot[] = { WEAR_COSTUME_BODY, WEAR_COSTUME_HAIR }; #endif static std::vector <BYTE> vec_slots (abSlot, abSlot + _countof(abSlot)); pBuff = M2_NEW CBuffOnAttributes(this, bType, &vec_slots); } break; bool CHARACTER::IsEquipUniqueItem(DWORD dwItemVnum) const { { LPITEM u = GetWear(WEAR_UNIQUE1); if (u && u->GetVnum() == dwItemVnum) return true; } { LPITEM u = GetWear(WEAR_UNIQUE2); if (u && u->GetVnum() == dwItemVnum) return true; } #ifdef ENABLE_COSTUME_MOUNT_SYSTEM { LPITEM u = GetWear(WEAR_COSTUME_MOUNT); if (u && u->GetVnum() == dwItemVnum) return true; } #endif // 언어반지인 경우 언어반지(견본) 인지도 체크한다. if (dwItemVnum == UNIQUE_ITEM_RING_OF_LANGUAGE) return IsEquipUniqueItem(UNIQUE_ITEM_RING_OF_LANGUAGE_SAMPLE); return false; } bool CHARACTER::IsEquipUniqueGroup(DWORD dwGroupVnum) const { { LPITEM u = GetWear(WEAR_UNIQUE1); if (u && u->GetSpecialGroup() == (int) dwGroupVnum) return true; } { LPITEM u = GetWear(WEAR_UNIQUE2); if (u && u->GetSpecialGroup() == (int) dwGroupVnum) return true; } #ifdef ENABLE_COSTUME_MOUNT_SYSTEM { LPITEM u = GetWear(WEAR_COSTUME_MOUNT); if (u && u->GetSpecialGroup() == (int)dwGroupVnum) return true; } #endif return false; } bool CHARACTER::UnEquipSpecialRideUniqueItem() { LPITEM Unique1 = GetWear(WEAR_UNIQUE1); LPITEM Unique2 = GetWear(WEAR_UNIQUE2); #ifdef ENABLE_COSTUME_MOUNT_SYSTEM LPITEM Unique3 = GetWear(WEAR_COSTUME_MOUNT); #endif if( NULL != Unique1 ) { if( UNIQUE_GROUP_SPECIAL_RIDE == Unique1->GetSpecialGroup() ) { return UnequipItem(Unique1); } } if( NULL != Unique2 ) { if( UNIQUE_GROUP_SPECIAL_RIDE == Unique2->GetSpecialGroup() ) { return UnequipItem(Unique2); } } #ifdef ENABLE_COSTUME_MOUNT_SYSTEM if (NULL != Unique3) { if (UNIQUE_GROUP_SPECIAL_RIDE == Unique3->GetSpecialGroup()) { return UnequipItem(Unique3); } } #endif return true; } if (item->GetWearFlag() & WEARABLE_UNIQUE) { #ifdef ENABLE_COSTUME_MOUNT_SYSTEM if ((GetWear(WEAR_UNIQUE1) && GetWear(WEAR_UNIQUE1)->IsSameSpecialGroup(item)) || (GetWear(WEAR_UNIQUE2) && GetWear(WEAR_UNIQUE2)->IsSameSpecialGroup(item)) || (GetWear(WEAR_COSTUME_MOUNT) && GetWear(WEAR_COSTUME_MOUNT)->IsSameSpecialGroup(item))) #else if ((GetWear(WEAR_UNIQUE1) && GetWear(WEAR_UNIQUE1)->IsSameSpecialGroup(item)) || (GetWear(WEAR_UNIQUE2) && GetWear(WEAR_UNIQUE2)->IsSameSpecialGroup(item))) #endif { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Nie mo?esz wyposa?y? dwoch unikalnych przedmiotow tego samego typu w tym samym czasie"));//같은 종류의 유니크 아이템 두 개를 동시에 장착할 수 없습니다. return false; } if (marriage::CManager::instance().IsMarriageUniqueItem(item->GetVnum()) && !marriage::CManager::instance().IsMarried(GetPlayerID())) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("결혼하지 않은 상태에서 예물을 착용할 수 없습니다.")); return false; } }
cmd_general.cpp
SpoilerACMD(do_unmount) { #ifdef ENABLE_COSTUME_MOUNT_SYSTEM LPITEM item = ch->GetWear(WEAR_UNIQUE1); LPITEM item2 = ch->GetWear(WEAR_UNIQUE2); LPITEM item3 = ch->GetWear(WEAR_COSTUME_MOUNT); if (item && item->IsRideItem()) ch->UnequipItem(item); if (item2 && item2->IsRideItem()) ch->UnequipItem(item2); if (item3 && item3->IsRideItem()) ch->UnequipItem(item3); #endif if (true == ch->UnEquipSpecialRideUniqueItem()) { ch->RemoveAffect(AFFECT_MOUNT); ch->RemoveAffect(AFFECT_MOUNT_BONUS); if (ch->IsHorseRiding()) { ch->StopRiding(); } } else { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("인벤토리가 꽉 차서 내릴 수 없습니다."));//인벤토리가 꽉 차서 내릴 수 없습니다. } } ACMD(do_ride){ dev_log(LOG_DEB0, "[DO_RIDE] start"); if (ch->IsDead() || ch->IsStun()) return; // 내리기 { if (ch->IsHorseRiding()) { dev_log(LOG_DEB0, "[DO_RIDE] stop riding"); ch->StopRiding(); return; } if (ch->GetMountVnum()) { dev_log(LOG_DEB0, "[DO_RIDE] unmount"); do_unmount(ch, NULL, 0, 0); return; } } // 타기 { if (ch->GetHorse() != NULL){ dev_log(LOG_DEB0, "[DO_RIDE] start riding"); ch->StartRiding(); return; } #ifdef EXTENDED_INVENTORY_PAGES for (int i=0; i<INVENTORY_MAX_NUM; ++i){ #else for (BYTE i=0; i<INVENTORY_MAX_NUM; ++i){ #endif LPITEM item = ch->GetInventoryItem(i); if (NULL == item) continue; // 유니크 탈것 아이템 if (item->IsRideItem()){ #ifdef ENABLE_COSTUME_MOUNT_SYSTEM if (NULL==ch->GetWear(WEAR_UNIQUE1) || NULL==ch->GetWear(WEAR_UNIQUE2) || NULL==ch->GetWear(WEAR_COSTUME_MOUNT)) #else if (NULL==ch->GetWear(WEAR_UNIQUE1) || NULL==ch->GetWear(WEAR_UNIQUE2)) #endif { dev_log(LOG_DEB0, "[DO_RIDE] USE UNIQUE ITEM"); ch->UseItem(TItemPos (INVENTORY, i)); return; } } // 일반 탈것 아이템 // TODO : 탈것용 SubType 추가 switch (item->GetVnum()){ case 71114: // 저신이용권 case 71116: // 산견신이용권 case 71118: // 투지범이용권 case 71120: // 사자왕이용권 dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM"); ch->UseItem(TItemPos (INVENTORY, i)); return; } // GF mantis #113524, 52001~52090 번 탈것 if( (item->GetVnum() > 52000) && (item->GetVnum() < 52091)){ dev_log(LOG_DEB0, "[DO_RIDE] USE QUEST ITEM"); ch->UseItem(TItemPos (INVENTORY, i)); return; } } } // 타거나 내릴 수 없을때 ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("말을 먼저 소환해주세요.")); }
item.cpp
Spoilerbool CItem::IsRideItem() { if (ITEM_UNIQUE == GetType() && UNIQUE_SPECIAL_RIDE == GetSubType()) return true; if (ITEM_UNIQUE == GetType() && UNIQUE_SPECIAL_MOUNT_RIDE == GetSubType()) return true; if (ITEM_COSTUME == GetType() && COSTUME_MOUNT == GetSubType()) return true; return false; } int CItem::FindEquipCell(LPCHARACTER ch, int iCandidateCell) { // 코스츔 아이템(ITEM_COSTUME)은 WearFlag 없어도 됨. (sub type으로 착용위치 구분. 귀찮게 또 wear flag 줄 필요가 있나..) // 용혼석(ITEM_DS, ITEM_SPECIAL_DS)도 SUB_TYPE으로 구분. 신규 반지, 벨트는 ITEM_TYPE으로 구분 -_- if ((0 == GetWearFlag() || ITEM_TOTEM == GetType()) && ITEM_COSTUME != GetType() && ITEM_DS != GetType() && ITEM_SPECIAL_DS != GetType() && ITEM_RING != GetType() && ITEM_BELT != GetType()) return -1; // 용혼석 슬롯을 WEAR로 처리할 수가 없어서(WEAR는 최대 32개까지 가능한데 용혼석을 추가하면 32가 넘는다.) // 인벤토리의 특정 위치((INVENTORY_MAX_NUM + WEAR_MAX_NUM)부터 (INVENTORY_MAX_NUM + WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX - 1)까지)를 // 용혼석 슬롯으로 정함. // return 할 때에, INVENTORY_MAX_NUM을 뺀 이유는, // 본래 WearCell이 INVENTORY_MAX_NUM를 빼고 return 하기 때문. if (GetType() == ITEM_DS || GetType() == ITEM_SPECIAL_DS) { if (iCandidateCell < 0) { return WEAR_MAX_NUM + GetSubType(); } else { for (int i = 0; i < DRAGON_SOUL_DECK_MAX_NUM; i++) { if (WEAR_MAX_NUM + i * DS_SLOT_MAX + GetSubType() == iCandidateCell) { return iCandidateCell; } } return -1; } } else if (GetType() == ITEM_COSTUME) { if (GetSubType() == COSTUME_BODY) return WEAR_COSTUME_BODY; else if (GetSubType() == COSTUME_HAIR) return WEAR_COSTUME_HAIR; #ifdef __SASH_SYSTEM__ else if (GetSubType() == COSTUME_ACCE) return WEAR_COSTUME_SASH; #endif else if (GetSubType() == COSTUME_MOUNT) return WEAR_COSTUME_MOUNT; else if (GetSubType() == COSTUME_WEAPON) return WEAR_COSTUME_WEAPON; } else if (GetType() == ITEM_RING) { if (ch->GetWear(WEAR_RING1)) return WEAR_RING2; else return WEAR_RING1; } else if (GetType() == ITEM_BELT) return WEAR_BELT; else if (GetWearFlag() & WEARABLE_BODY) return WEAR_BODY; else if (GetWearFlag() & WEARABLE_HEAD) return WEAR_HEAD; else if (GetWearFlag() & WEARABLE_FOOTS) return WEAR_FOOTS; else if (GetWearFlag() & WEARABLE_WRIST) return WEAR_WRIST; else if (GetWearFlag() & WEARABLE_WEAPON) return WEAR_WEAPON; else if (GetWearFlag() & WEARABLE_SHIELD) return WEAR_SHIELD; else if (GetWearFlag() & WEARABLE_NECK) return WEAR_NECK; else if (GetWearFlag() & WEARABLE_EAR) return WEAR_EAR; else if (GetWearFlag() & WEARABLE_ARROW) return WEAR_ARROW; else if (GetWearFlag() & WEARABLE_UNIQUE) { if (ch->GetWear(WEAR_UNIQUE1)) return WEAR_UNIQUE2; else return WEAR_UNIQUE1; } // 수집 퀘스트를 위한 아이템이 박히는곳으로 한번 박히면 절대 E수 없다. else if (GetWearFlag() & WEARABLE_ABILITY) { if (!ch->GetWear(WEAR_ABILITY1)) { return WEAR_ABILITY1; } else if (!ch->GetWear(WEAR_ABILITY2)) { return WEAR_ABILITY2; } else if (!ch->GetWear(WEAR_ABILITY3)) { return WEAR_ABILITY3; } else if (!ch->GetWear(WEAR_ABILITY4)) { return WEAR_ABILITY4; } else if (!ch->GetWear(WEAR_ABILITY5)) { return WEAR_ABILITY5; } else if (!ch->GetWear(WEAR_ABILITY6)) { return WEAR_ABILITY6; } else if (!ch->GetWear(WEAR_ABILITY7)) { return WEAR_ABILITY7; } else if (!ch->GetWear(WEAR_ABILITY8)) { return WEAR_ABILITY8; } else { return -1; } } return -1; }
item_manager.cpp
Spoilerif (item->GetType() == ITEM_QUEST) { for (itertype (m_map_pkQuestItemGroup) it = m_map_pkQuestItemGroup.begin(); it != m_map_pkQuestItemGroup.end(); it++) { if (it->second->m_bType == CSpecialItemGroup::QUEST && it->second->Contains(vnum)) { item->SetSIGVnum(it->first); } } } else if (item->GetType() == ITEM_UNIQUE) { for (itertype(m_map_pkSpecialItemGroup) it = m_map_pkSpecialItemGroup.begin(); it != m_map_pkSpecialItemGroup.end(); it++) { if (it->second->m_bType == CSpecialItemGroup::SPECIAL && it->second->Contains(vnum)) { item->SetSIGVnum(it->first); } } } else if (item->GetType() == ITEM_UNIQUE || item->GetSubType() == COSTUME_MOUNT) { for (itertype(m_map_pkSpecialItemGroup) it = m_map_pkSpecialItemGroup.begin(); it != m_map_pkSpecialItemGroup.end(); it++) { if (it->second->m_bType == CSpecialItemGroup::SPECIAL && it->second->Contains(vnum)) { item->SetSIGVnum(it->first); } } }
questlua_pc.cpp
Spoilerint pc_get_special_ride_vnum(lua_State* L) { LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr(); if (NULL != pChar) { LPITEM Unique1 = pChar->GetWear(WEAR_UNIQUE1); LPITEM Unique2 = pChar->GetWear(WEAR_UNIQUE2); LPITEM Unique3 = pChar->GetWear(WEAR_COSTUME_MOUNT); if (NULL != Unique1) { if (UNIQUE_GROUP_SPECIAL_RIDE == Unique1->GetSpecialGroup()) { lua_pushnumber(L, Unique1->GetVnum()); lua_pushnumber(L, Unique1->GetSocket(2)); return 2; } } if (NULL != Unique2) { if (UNIQUE_GROUP_SPECIAL_RIDE == Unique2->GetSpecialGroup()) { lua_pushnumber(L, Unique2->GetVnum()); lua_pushnumber(L, Unique2->GetSocket(2)); return 2; } } if (NULL != Unique3) { if (UNIQUE_GROUP_SPECIAL_RIDE == Unique3->GetSpecialGroup()) { lua_pushnumber(L, Unique3->GetVnum()); lua_pushnumber(L, Unique3->GetSocket(2)); return 2; } } } lua_pushnumber(L, 0); lua_pushnumber(L, 0); return 2; }
DumpProto:
ItemCSVReader.cpp
Spoilerstatic string arSub28[] = { "COSTUME_BODY", "COSTUME_HAIR", #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT "COSTUME_ACCE", "COSTUME_MOUNT", "COSTUME_WEAPON" #endif }; int get_Item_WearFlag_Value(string inputString){ string arWearrFlag[] = { "WEAR_BODY", "WEAR_HEAD", "WEAR_FOOTS", "WEAR_WRIST", "WEAR_WEAPON", "WEAR_NECK", "WEAR_EAR", "WEAR_SHIELD", "WEAR_UNIQUE", "WEAR_ARROW", #ifdef ENABLE_NEW_ITEM_PROTO_STRUCT "WEAR_HAIR", "WEAR_ABILITY", "WEAR_PENDANT", "WEAR_COSTUME_SASH", "WEAR_COSTUME_MOUNT", "WEAR_COSTUME_WEAPON" #endif };
Client: costumewindow.py
Spoilerimport uiScriptLocale import item import app COSTUME_START_INDEX = item.COSTUME_SLOT_START window = { "name" : "CostumeWindow", "x" : SCREEN_WIDTH - 175 - 140, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 140, "height" : (180 + 47), #기존보다 47 길어짐 "children" : ( { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 140, "height" : (180 + 47), "children" : ( ## Title { "name" : "TitleBar", "type" : "titlebar", "style" : ("attach",), "x" : 6, "y" : 6, "width" : 130, "color" : "yellow", "children" : ( { "name":"TitleName", "type":"text", "x":60, "y":3, "text":uiScriptLocale.COSTUME_WINDOW_TITLE, "text_horizontal_align":"center" }, ), }, ## Equipment Slot { "name" : "Costume_Base", "type" : "image", "x" : 13, "y" : 38, "image" : uiScriptLocale.LOCALE_UISCRIPT_PATH + "costume/new_costume_bg.jpg", "children" : ( { "name" : "CostumeSlot", "type" : "slot", "x" : 3, "y" : 3, "width" : 127, "height" : 145 + 47, "slot" : ( {"index":COSTUME_START_INDEX+0, "x":62, "y":45, "width":32, "height":64},#몸 {"index":COSTUME_START_INDEX+1, "x":62, "y": 9, "width":32, "height":32},#머리 {"index":COSTUME_START_INDEX+2, "x":13, "y":126, "width":32, "height":32},#마운트 {"index":COSTUME_START_INDEX+3, "x":62, "y":126, "width":32, "height":32},#악세서리 {"index":COSTUME_START_INDEX+4, "x":13, "y":13, "width":32, "height":96},#악세서리 #{"index":item.COSTUME_SLOT_WEAPON, "x":13, "y":13, "width":32, "height":96},#무기 ), }, ), }, ), }, ), }
-
14 godzin temu, VegaS™ napisał:
thanks, btw i have one more question how i can add to item_award
money_drop_rate_expire?
or it imposible
-
Hello, how i can set time to item in item_award?
-
-
-
Hello, im looking for someone who can
1.fix country and empire flag by Vegas
2.pvp icons
3.AUCTION HOUSE
*if item time expired item going to mailbox
if item boughted item going to mailbox
if item canceled item going to mailbox......
for more informations msg me
Thanks
- 1
-
Hello, how i can colored monster name different by level?
player level > mob.level = color white
mob.level > player.level = color green
-
-
Hello, how i can create new function Like getName()
but i need function player->test as value, and account->test as string
getPlayerTest()
getAccountTest()
-
-
Hello, someone who have mob_proto with them pets and others please post
thanks
-
1 godzinę temu, Moț napisał:
3010 eâ+0 ITEM_WEAPON WEAPON_TWO_HANDED 3 ANTI_ASSASSIN | ANTI_SURA | ANTI_MUDANG ITEM_TUNABLE WEAR_WEAPON 400 400 3011 28 0 LEVEL 5 LIMIT_NONE 0 APPLY_ATT_SPEED 38 APPLY_NONE 0 APPLY_NONE 0 0 0 0 23 33 0 0 1 0
Edit :
3010 eâ+0 ITEM_WEAPON WEAPON_TWO_HANDED 3 ANTI_ASSASSIN | ANTI_SURA | ANTI_MUDANG | ANTI_WOLFMAN ITEM_TUNABLE WEAR_WEAPON NONE 400 400 3011 28 15 LEVEL 5 LIMIT_NONE 0 APPLY_ATT_SPEED 38 APPLY_NONE 0 APPLY_NONE 0 0 0 0 23 33 0 0 1 0 MASK_ITEM_TYPE_EQUIPMENT_WEAPON MASK_ITEM_SUBTYPE_WEAPON_WEAPON_TWO_HANDED
solved, i fixed in other way
-
solved.
-
Hello, how i can change etc_drop_item load by name to load by vnum?
i found
const int FILE_NAME_LEN = 256;
-
doesn't work
16>PythonItemModule.obj : error LNK2001: unresolved external symbol "public: unsigned char __thiscall CItemData::GetMaskType(void)const " (?GetMaskType@CItemData@@QBEEXZ)
16>PythonItemModule.obj : error LNK2001: unresolved external symbol "public: unsigned char __thiscall CItemData::GetMaskSubType(void)const " (?GetMaskSubType@CItemData@@QBEEXZ) -
Hello, i have a problem with fix this limit can anyone help me? because ITEM_MEDIUM and ITEM_SOUL doesn't load
int get_Item_Type_Value(string inputString) { string arType[] = {"ITEM_NONE", "ITEM_WEAPON", "ITEM_ARMOR", "ITEM_USE", "ITEM_AUTOUSE", "ITEM_MATERIAL", "ITEM_SPECIAL", "ITEM_TOOL", "ITEM_LOTTERY", "ITEM_ELK", //10개 "ITEM_METIN", "ITEM_CONTAINER", "ITEM_FISH", "ITEM_ROD", "ITEM_RESOURCE", "ITEM_CAMPFIRE", "ITEM_UNIQUE", "ITEM_SKILLBOOK", "ITEM_QUEST", "ITEM_POLYMORPH", //20개 "ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY", "ITEM_SKILLFORGET", "ITEM_GIFTBOX", "ITEM_PICK", "ITEM_HAIR", "ITEM_TOTEM", "ITEM_BLEND", "ITEM_COSTUME", "ITEM_DS", //30개 "ITEM_SPECIAL_DS", "ITEM_EXTRACT", "ITEM_SECONDARY_COIN", //33개 "ITEM_RING", "ITEM_BELT", //35개 (EItemTypes 값으로 치면 34) "ITEM_PET", //36 "ITEM_GACHA", "ITEM_MEDIUM", //38 "ITEM_SOUL", }; int retInt = -1; //cout << "Type : " << typeStr << " -> "; for (int j=0;j<sizeof(arType)/sizeof(arType[0]);j++) { string tempString = arType[j]; if (inputString.find(tempString)!=string::npos && tempString.find(inputString)!=string::npos) { //cout << j << " "; retInt = j; break; } } //cout << endl; return retInt; }
-
13 godzin temu, tierrilopes napisał:
Doesnt seem like the best comparison in my opinion.
Does wow, gw2, tera and such use serverside only "protos"? Dont think so.
Why? Due to my first reply.
They use and have problems with hacks. At like tibia you can't use any damage or another bug to hit more because everything load from server side. And i want reach the same goal.
Btw.
When monster hit you or you hit monster = dos your db.
-
Hello, why new .Epk and Epx is broken?
broken:
metin2_patch_dragon_rock_mobs .... .... and more
can someone explain why? and some idea how i can fix it and load without probloms as like official GameForge metin2.
Spider Dungeon Graphics Bug - black screen
in Community Support - Questions & Answers
Posted
bump