Wie man hier sieht ist es Tabgetrennt möglich mehrere Shinings zugleich auf ein Gegenstand zu legen. Das derzeitige Maximum ist auf 3 konfiguriert. Aber natürlich nach Belieben ins unermessliche erweiterbar.
Das System ist sowohl mit Rüstungen als auch Waffen ausgiebig getestet und ebenfalls für den Lykaner funktional.
Ich habe versucht einiges an Code zu kommentieren um euch evtl. auch verstehen zu lassen was ihr da einbaut.
Sucht in der Funktion
void CInstanceBase::SetArmor(DWORD dwArmor)
nach:
__GetRefinedEffect(pItemData);
Darunter:
#ifdef ENABLE_SHINING_SYSTEM
__GetShiningEffect(pItemData);
#endif
unter:
__ClearArmorRefineEffect();
das hier:
#ifdef ENABLE_SHINING_SYSTEM
__ClearArmorShiningEffect();
#endif
Sucht in der Funktion
bool CInstanceBase::SetWeapon(DWORD eWeapon)
nach:
__GetRefinedEffect(pItemData);
und darunter:
#ifdef ENABLE_SHINING_SYSTEM
__GetShiningEffect(pItemData);
#endif
unter:
__ClearWeaponRefineEffect();
das hier:
#ifdef ENABLE_SHINING_SYSTEM
__ClearWeaponShiningEffect();
#endif
Sucht nach:
m_swordRefineEffectRight = 0;
m_swordRefineEffectLeft = 0;
m_armorRefineEffect = 0;
darunter:
#ifdef ENABLE_SHINING_SYSTEM
__ClearWeaponShiningEffect(false);
#endif
Nun ein ganz großer Block, einfach ganz am Ende der InstanceBase.cpp adden.
Code:
#ifdef ENABLE_SHINING_SYSTEM
//This method checks if the item has shinings and will attach them.
//Weapons are heaving special checks for two sided weapons like daggers or fans while mounting.
//Every itemtype is supported. If no explicit logic is implemented it will be attached to "Bip01".
void CInstanceBase::__GetShiningEffect(CItemData* pItem)
{
//Set this to true if you want to hide the refine effect if there's a shining for this item.
bool removeRefineEffect = false;
CItemData::TItemShiningTable shiningTable = pItem->GetItemShiningTable();
if (pItem->GetType() == CItemData::ITEM_TYPE_WEAPON)
{
if (removeRefineEffect)
{
__ClearWeaponRefineEffect();
}
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (strcmp(shiningTable.szShinings[i], ""))
{
//Check for double sided weapons or fan which is attached on both sides when mounted.
#ifdef ENABLE_WOLFMAN
bool twoSidedWeapon = pItem->GetSubType() == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetSubType() == CItemData::WEAPON_FAN) || pItem->GetSubType() == CItemData::WEAPON_CLAW;
#else
bool twoSidedWeapon = pItem->GetSubType() == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetSubType() == CItemData::WEAPON_FAN);
#endif
if (twoSidedWeapon)
{
__AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");
}
__AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON");
}
}
}
else
{
if (removeRefineEffect)
{
__ClearArmorRefineEffect();
}
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (strcmp(shiningTable.szShinings[i], ""))
{
__AttachArmorShiningEffect(i, shiningTable.szShinings[i]);
}
}
}
}
//Attaching the shining effect.
//BoneName can be "PART_WEAPON" or "PART_WEAPON_LEFT" to get the attaching bone name dynamically.
//If boneName is not given "Bip01" is used as boneName.
void CInstanceBase::__AttachWeaponShiningEffect(int effectIndex, const char* effectFileName, const char* boneName)
{
if (IsAffect(AFFECT_INVISIBILITY))
{
return;
}
if (effectIndex >= CItemData::ITEM_SHINING_MAX_COUNT)
{
return;
}
CEffectManager::Instance().RegisterEffect(effectFileName, false, false);
if (!strcmp(boneName, "PART_WEAPON"))
{
const char* c_szRightBoneName;
m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON, &c_szRightBoneName);
if (strcmp(c_szRightBoneName, ""))
{
m_weaponShiningEffects[0][effectIndex] = m_GraphicThingInstance.AttachEffectByName(0, c_szRightBoneName, effectFileName);
}
}
else if (!strcmp(boneName, "PART_WEAPON_LEFT"))
{
const char* c_szLeftBoneName;
m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON_LEFT, &c_szLeftBoneName);
if (strcmp(c_szLeftBoneName, ""))
{
m_weaponShiningEffects[1][effectIndex] = m_GraphicThingInstance.AttachEffectByName(0, c_szLeftBoneName, effectFileName);
}
}
else
{
Tracef("Invalid partname for getting attaching bone name. %s - %s", effectFileName, boneName);
}
}
//Attaching the armor shining effect.
//If boneName is not given "Bip01" is used as boneName.
void CInstanceBase::__AttachArmorShiningEffect(int effectIndex, const char* effectFileName, const char* boneName)
{
if (IsAffect(AFFECT_INVISIBILITY))
{
return;
}
if (effectIndex >= CItemData::ITEM_SHINING_MAX_COUNT)
{
return;
}
if (!strcmp(boneName, ""))
{
Tracef("Empty bone name for attaching armor shining. Effect Index: %i, EffectFileName: %s", effectIndex, effectFileName);
return;
}
CEffectManager::Instance().RegisterEffect(effectFileName, false, false);
m_armorShiningEffects[effectIndex] = m_GraphicThingInstance.AttachEffectByName(0, boneName, effectFileName);
}
//Clears all weapon shining effects. Left & Right if set.
void CInstanceBase::__ClearWeaponShiningEffect(bool detaching)
{
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (m_weaponShiningEffects[0][i])
{
if (detaching)
{
__DetachEffect(m_weaponShiningEffects[0][i]);
}
m_weaponShiningEffects[0][i] = 0;
}
if (m_weaponShiningEffects[1][i])
{
if (detaching)
{
__DetachEffect(m_weaponShiningEffects[1][i]);
}
m_weaponShiningEffects[1][i] = 0;
}
}
}
//Clears all armor shining effects.
void CInstanceBase::__ClearArmorShiningEffect(bool detaching)
{
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (detaching)
{
__DetachEffect(m_armorShiningEffects[i]);
}
m_armorShiningEffects[i] = 0;
}
}
#endif
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
// ..................
m_weaponShiningEffects[0][i] = 0;
m_weaponShiningEffects[1][i] = 0;
}
The idea isn't so bad, but some things isn't too good, like this one.
When you can use memset (is useful for intializing a section of memory to some value), without a loop for nothing.
Python hat dafür sehr schöne und einfache Tuple Funktionen, mit einer TXT macht man das nur unnötig fett und umständlich. Schön sieht das dann auch nicht aus.
Python hat dafür sehr schöne und einfache Tuple Funktionen, mit einer TXT macht man das nur unnötig fett und umständlich. Schön sieht das dann auch nicht aus.
Weiß nicht was an einer Datei abändern umständlich und Fett sein sollte.
Ich weiß schon warum du die Kuh als Profilbild hast. (no Hate hab dich lieb)
[Selling] Metin2 ShiningSystem 11/19/2015 - Metin2 Trading - 6 Replies Hallo liebe EpvpCom.
Heute möchte ich euch ein Shining System zum verkauf anbieten was es kann fragt ihr euch sicherlich.
Ihr könnt eurem Charakter unabhänig von der Waffe/Rüstung neue Shinings/Glitzern hinzufügen wie ihr es wollt das ganze ist Per Items geregelt
Ein Vid dazu gibt es auch:
[Selling] [C++/Python][P-Server]Shiningsystem 09/14/2015 - Metin2 Trading - 10 Replies Hallo Leute,
heute möchte ich euch mein Shiningsystem für euren Server anbieten.
Das ganze schaut wie folgt aus:
https://www.youtube.com/watch?v=ravAag0962E
Aktuelle GUI:
[Selling] [C++/Python][P-Server]Shiningsystem 08/23/2015 - Metin2 Trading - 5 Replies Hallo Leute,
heute möchte ich euch mein Shiningsystem für euren Server anbieten.
Das ganze schaut wie folgt aus:
https://www.youtube.com/watch?v=ravAag0962E
Aktuelle GUI:
http://puu.sh/jA8Qt/1157b01953.jpg
Eure Meinung zum Shiningsystem 08/20/2015 - Metin2 Private Server - 26 Replies Hallo Leute,
für meinen Server kam mir die Idee ein "neues" Shiningsystem zu coden.
Dabei sollte es möglich sein unterschiedliche Effekte zu kombinieren ohne das es von einer Rüstung oder Waffe abhängig ist.
Nun wollte ich eure Meinungen dazu haben. Was würdet ihr verbessern/ändern?
Was haltet ihr im ganzen von der Idee?
Hier geht es zum Video: https://www.youtube.com/watch?v=ravAag0962E