Metin2 PvP serverınızda düello için 3-2-1 geri sayımı ekleyebilirsiniz.
service.h
Kod:#define ENABLE_3_2_1_GO
pvp.cpp
Kod:# Arat void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim) # Üstüne Ekle #ifdef ENABLE_3_2_1_GO EVENTINFO(start_duel_efect_info) { LPCHARACTER ch1; LPCHARACTER ch2; CPVP * pkPVP; BYTE state; start_duel_efect_info() : ch1( NULL ) ,ch2( NULL ) ,pkPVP( NULL ) ,state( 0 ) { } }; EVENTFUNC(start_duel_efect) { start_duel_efect_info * info = dynamic_cast<start_duel_efect_info *>(event->info); if ((info == NULL) || (info->ch1 == NULL) || (info->ch2 == NULL) || (info->pkPVP == NULL)) return 0; switch (info->state) { case 0: { info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse"); info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/3.mse"); info->state++; return PASSES_PER_SEC(1); break; } case 1: { info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse"); info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/2.mse"); info->state++; return PASSES_PER_SEC(1); break; } case 2: { info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse"); info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/1.mse"); info->state++; return PASSES_PER_SEC(1); break; } case 3: { info->ch1->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse"); info->ch2->SpecificEffectPacket("d:/ymir work/effect/pvp/go.mse"); if (info->pkPVP->Agree(info->ch1->GetPlayerID())) { info->ch2->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch1->GetName()); info->ch1->ChatPacket(CHAT_TYPE_INFO, "Duelul cu: %s a inceput!", info->ch2->GetName()); } return 0; break; } } return 0; } #endif # Arat void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim) # Değiştir #ifdef ENABLE_3_2_1_GO void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim) { if (pkChr->IsDead() || pkVictim->IsDead() || pkChr->FindAffect(AFFECT_PVP_START)) return; CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID()); CPVP * pkPVP; if (pkPVP = Find(kPVP.m_dwCRC)) { start_duel_efect_info * info = AllocEventInfo<start_duel_efect_info>(); info->ch1 = pkChr; info->ch2 = pkVictim; info->pkPVP = pkPVP; info->state = 0; pkChr->AddAffect(AFFECT_PVP_START, APPLY_NONE, 0, 0, 5, 0, false); event_create(start_duel_efect, info, 0); return; } pkPVP = M2_NEW CPVP(kPVP); pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID()); pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID()); m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP)); m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP); m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP); pkPVP->Packet(); char msg[CHAT_MAX_LEN + 1]; snprintf(msg, sizeof(msg), "Ai fost provocat la duel de: %s.", pkChr->GetName()); //e el pkVictim->ChatPacket(CHAT_TYPE_INFO, msg); pkChr->ChatPacket(CHAT_TYPE_INFO, "L-ai provocat la duel pe: %s.", pkVictim->GetName()); //is eu // NOTIFY_PVP_MESSAGE LPDESC pkVictimDesc = pkVictim->GetDesc(); if (pkVictimDesc) { TPacketGCWhisper pack; int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1); pack.bHeader = HEADER_GC_WHISPER; pack.wSize = sizeof(TPacketGCWhisper) + len; pack.bType = WHISPER_TYPE_SYSTEM; strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom)); TEMP_BUFFER buf; buf.write(&pack, sizeof(TPacketGCWhisper)); buf.write(msg, len); pkVictimDesc->Packet(buf.read_peek(), buf.size()); } // END_OF_NOTIFY_PVP_MESSAGE } #else void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim) { if (pkChr->IsDead() || pkVictim->IsDead()) return; CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID()); CPVP * pkPVP; if ((pkPVP = Find(kPVP.m_dwCRC))) { // ???oC? ?o ?O?c¬c¬e ??!¤I c©I??! if (pkPVP->Agree(pkChr->GetPlayerID())) { pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkChr->GetName()); pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%scYO!Au?C cYe!Aa c©???!"), pkVictim->GetName()); } return; } pkPVP = M2_NEW CPVP(kPVP); pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID()); pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID()); m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP)); m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP); m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP); pkPVP->Packet(); char msg[CHAT_MAX_LEN + 1]; snprintf(msg, sizeof(msg), LC_TEXT("%scYO?? cYe!Aac©??!í?!í C©¬c©?cY?cY?. c©A©©!iC?!¤Ac¬e cYe!AaYi??Cc¬| C????a."), pkChr->GetName()); pkVictim->ChatPacket(CHAT_TYPE_INFO, msg); pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s?c§!AO cYe!Aac©??!í?!í C©¬c©?cY?cY?."), pkVictim->GetName()); // NOTIFY_PVP_MESSAGE LPDESC pkVictimDesc = pkVictim->GetDesc(); if (pkVictimDesc) { TPacketGCWhisper pack; int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1); pack.bHeader = HEADER_GC_WHISPER; pack.wSize = sizeof(TPacketGCWhisper) + len; pack.bType = WHISPER_TYPE_SYSTEM; strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom)); TEMP_BUFFER buf; buf.write(&pack, sizeof(TPacketGCWhisper)); buf.write(msg, len); pkVictimDesc->Packet(buf.read_peek(), buf.size()); } // END_OF_NOTIFY_PVP_MESSAGE } #endif # Arat bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID) # Değiştir #ifdef ENABLE_3_2_1_GO bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID) { CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID()); if (it == m_map_pkPVPSetByID.end()) return false; bool found = false; sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID()); TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin(); while (it2 != it->second.end()) { CPVP * pkPVP = *it2++; DWORD dwCompanionPID; if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID()) dwCompanionPID = pkPVP->m_players[1].dwPID; else dwCompanionPID = pkPVP->m_players[0].dwPID; if (dwCompanionPID == dwKillerPID) { if (pkPVP->IsFight()) { pkPVP->SetLastFightTime(); pkPVP->Win(dwKillerPID); found = true; break; } else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000) { found = true; break; } } } LPCHARACTER pkChrW = CHARACTER_MANAGER::instance().FindByPID(dwKillerPID); pkChrW->SpecificEffectPacket("d:/ymir work/effect/pvp/win.mse"); return found; } #else bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID) { CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID()); if (it == m_map_pkPVPSetByID.end()) return false; bool found = false; sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID()); TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin(); while (it2 != it->second.end()) { CPVP * pkPVP = *it2++; DWORD dwCompanionPID; if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID()) dwCompanionPID = pkPVP->m_players[1].dwPID; else dwCompanionPID = pkPVP->m_players[0].dwPID; if (dwCompanionPID == dwKillerPID) { if (pkPVP->IsFight()) { pkPVP->SetLastFightTime(); pkPVP->Win(dwKillerPID); found = true; break; } else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000) { found = true; break; } } } return found; } #endif
affect.h
Kod:# Arat AFFECT_DRAGON_SOUL_DECK_1 = 542, # Altına Ekle #ifdef ENABLE_3_2_1_GO AFFECT_PVP_START = 543, AFFECT_PVP_WIN = 544, #endif # Arat AFF_BITS_MAX # Üstüne Ekle #ifdef ENABLE_3_2_1_GO AFF_PVP_START, AFF_PVP_WIN, #endif
Aşağıdaki efekt dosyası, tercihe bağlı olarak bir klasör içine eklenip kapatıldıktan sonra pack dosyasına dahil edilebilir. Son olarak, indexe eklenmesi yeterlidir.
Alternatif olarak, mevcut pack içine doğrudan eklenip kapatılarak da kullanılabilir.
Efekt dosyası:
<b>[Gizli içerik]</b>
thanks