|
You last visited: Today at 09:23
Advertisement
[Release][Cplusplus] Yangbarren
Discussion on [Release][Cplusplus] Yangbarren within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.
08/12/2015, 07:56
|
#1
|
elite*gold: 2785
Join Date: Dec 2014
Posts: 403
Received Thanks: 1,354
|
[Release][Cplusplus] Yangbarren
Hallöchen,
da ich versuche so wenig mit quests zu regeln habe ich die Barrenfunktion auch in den Source gebaut. Der code ist nicht der beste ich weiß das ihr es alle besser könnt
Was brauchen wir denn alles ?
- char.cpp
- char_item.cpp
- char.h
Fangen wir mit der char.h an, und suchen:
Code:
public:
bool ItemProcess_Polymorph(LPITEM item);
und fügen darunter:
Code:
int ChangeGold(long gold = 0);
So speichern und die char.cpp öffnen.
in der char.cpp fügt ihr ganz am ende diese funktion ein:
Code:
int CHARACTER::ChangeGold(long gold)
{
DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, GetPlayerID(), gold);
PointChange(POINT_GOLD, gold, true);
}
Speichern und die char_item.cpp öffnen.
sucht in der char_item.cpp diesen abschnitt:
Code:
if (false == item->IsEquipped())
item->SetSocket(1, item->GetSocket(1) + 1);
darunter fügt ihr das ein:
Code:
switch (item->GetVnum())
{
case 80003: // 50k
case 80004: // 100k
case 80005: // 500k
case 80006: // 1kk
case 80007: // 2kk
int idx[5];
idx[0] = 50000;
idx[1] = 100000;
idx[2] = 500000;
idx[3] = 1000000;
idx[4] = 2000000;
int idax;
if (item->GetVnum() == 80003)
idax = 0;
if (item->GetVnum() == 80004)
idax = 1;
if (item->GetVnum() == 80005)
idax = 2;
if (item->GetVnum() == 80006)
idax = 3;
if (item->GetVnum() == 80007)
idax = 4;
long val;
val = idx[idax];
if (ChangeGold(val))
{
//ChatPacket(CHAT_TYPE_INFO, "Du hast %ld Yang erhalten.", val); // {0}
item->SetCount(item->GetCount() - 1);
}
else
{
ChatPacket(CHAT_TYPE_INFO, "Es ist ein Fehler aufgetreten. Bitte wenden sie sich an den Admin.");
}
return 1;
break;
default:
break;
}
sollte so aussehen:
Bestehende bugs:
wenn man die Chatausgabe wieder einfügt also die "//" weg macht dann kommt der Text 2x das man das Yang erhalten hatt, wieso auch immer.
Ich hoffe ihr könnt was damit anfangen.
.Kori
|
|
|
08/12/2015, 08:59
|
#2
|
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
|
Du hast da eine ChangeGold-Funktion mit Rückgabetyp "int" (Integer) die nichts zurückgibt; einige Compiler werden das so nicht mal kompilieren. Außerdem wenn du großes Pech hast kann dadurch ein Fehler passieren, falls die Rückgabe zufällig 0 ist (die Chance dafür ist zugegebener Maßen klein aber es KANN passieren).
Der Text kommt 2x wenn man die Meldung reinmacht, da du in der PointChange(POINT_GOLD)-Funktion bei "amount" ein "true" hingesetzt hat und der Client dann die Chat-Meldung selbst aufruft (siehe game.py, da steht die Meldung drinne bzw. ein Verweis auf die locale_game.txt mit der Meldung).
Kind Regards,
Lefloyd
|
|
|
08/12/2015, 09:04
|
#3
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Kann zwar nicht wirklich C++, aber das hier müsste gehen:
Code:
int value = 0;
switch (item->GetVnum())
{
case 80003: // 50k
value = 50000;
break;
case 80004: // 100k
value = 100000;
break;
case 80005: // 500k
value = 500000;
break;
case 80006: // 1kk
value = 1000000;
break;
case 80007: // 2kk
value = 2000000;
break;
default:
return 0;
}
if (ChangeGold(value))
item->SetCount(item->GetCount() - 1);
else
ChatPacket(CHAT_TYPE_INFO, "Es ist ein Fehler aufgetreten. Bitte wenden Sie sich an den Admin.");
return 1;
allerdings finde ich, dass man solche Sachen lieber per Quest regeln sollte. Möchte man hier kleine Änderungen machen muss man die ganze game neu compilen, wofür hat man dann noch die Questschnittstelle?
|
|
|
08/12/2015, 09:06
|
#4
|
elite*gold: 2785
Join Date: Dec 2014
Posts: 403
Received Thanks: 1,354
|
Quote:
Originally Posted by Lefloyd
Du hast da eine ChangeGold-Funktion mit Rückgabetyp "int" (Integer) die nichts zurückgibt; einige Compiler werden das so nicht mal kompilieren. Außerdem wenn du großes Pech hast kann dadurch ein Fehler passieren, falls die Rückgabe zufällig 0 ist (die Chance dafür ist zugegebener Maßen klein aber es KANN passieren).
Der Text kommt 2x wenn man die Meldung reinmacht, da du in der PointChange(POINT_GOLD)-Funktion bei "amount" ein "true" hingesetzt hat und der Client dann die Chat-Meldung selbst aufruft (siehe game.py, da steht die Meldung drinne bzw. ein Verweis auf die locale_game.txt mit der Meldung).
Kind Regards,
Lefloyd
|
Danke das du mir die Tipps gegeben hast, ja ich hatte bis jezt keine Propleme damit und geht auch alles reibungslos.
also dafür das ich echt neu in c++ bin glaube ich das es erstmal eine humane lösung ist
|
|
|
08/12/2015, 09:12
|
#5
|
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
|
Ja klar, wie gesagt die Chance dass es mal nicht funktioniert ist ziemlich klein, aber dennoch sollte man alle möglichen Fehler verhindern oder nicht ? Musst dafür ja nur in der ChangeGold einfach nen return 1; oder so am Ende machen.. ^^
Sensi's Lösung würde wohl funktionieren, sofern er auch in der ChangeGold(yang) das "yang" in "value" ändern würde, aber das war wohl eher nen Flüchtigkeitsfehler :3 Ich für meinen Teil hätte es einfach über value0 oder sowas gelöst, dass da der Yang-Wert der ausgegeben werden soll drinne stehen muss. Das würde das ganze etwas dynamischer machen Falls du es jedoch mit deiner Lösung machen willst, schlage ich vor es mit einem konstanten Array zu lösen:
Code:
const int aiValues[] = {
50000,
100000,
500000,
1000000,
2000000,
};
int iIndex = item->GetVnum() - 80003;
if (ChangeGold(aiValues[iIndex]))
[....]
Mit freundlichen Grüßen,
Lefloyd
|
|
|
08/12/2015, 09:16
|
#6
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Quote:
Originally Posted by Lefloyd
Sensi's Lösung würde wohl funktionieren, sofern er auch in der ChangeGold(yang) das "yang" in "value" ändern würde, aber das war wohl eher nen Flüchtigkeitsfehler :3
|
Danke, hab erst überall yang als Variable benutzt, fand dann aber value doch sprechender und habe es bei ChangeGold vergessen. Ausserdem habe ich beim default noch return 0 gemacht, damit sollte es auch keine compile-Fehler geben
|
|
|
08/12/2015, 09:22
|
#7
|
elite*gold: 0
Join Date: Aug 2012
Posts: 749
Received Thanks: 188
|
Warum const?
|
|
|
08/12/2015, 11:27
|
#8
|
elite*gold: 0
Join Date: Sep 2013
Posts: 491
Received Thanks: 675
|
Musst du nicht noch nach dem Overflow fragen?
|
|
|
08/12/2015, 16:36
|
#9
|
elite*gold: 30
Join Date: Jul 2010
Posts: 1,627
Received Thanks: 1,450
|
wieso nimmst nicht PointChange ? da als Type das Yang übergeben...
|
|
|
08/12/2015, 16:38
|
#10
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Quote:
Originally Posted by .Risan.
wieso nimmst nicht PointChange ? da als Type das Yang übergeben...
|
Quote:
Originally Posted by .K0rí
Code:
int CHARACTER::ChangeGold(long gold)
{
DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, GetPlayerID(), gold);
PointChange(POINT_GOLD, gold, true);
}
|
nutzt er doch
|
|
|
08/12/2015, 16:48
|
#11
|
elite*gold: 30
Join Date: Jul 2010
Posts: 1,627
Received Thanks: 1,450
|
hopla, hab den Code nicht genau angeschaut... Sry
Ich hätte es so gemacht.. erstmal..
PHP Code:
////////////////////////////////////////////////////////////////////////// /// Goldbarren Area START if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007) //Wert in item_proto spalte value0 eintragen { int iGoldValue0 = item->GetValue(0); if (iGoldValue0 == 0) ChatPacket(CHAT_TYPE_INFO, "Kein Wert vorhanden"); return; if (iGoldValue0 >= g_llMaxGold) //Max Gold on Inventar ChatPacket(CHAT_TYPE_INFO, "Du Übersteigst die Yangrenze von %u",g_llMaxGold); return; if ( ( iGoldValue0 + GetGold() ) >= g_llMaxGold) //Max Gold on Inventar ChatPacket(CHAT_TYPE_INFO, "Du Übersteigst die Yangrenze von %u",g_llMaxGold); return; if (item->GetCount() > 0) item->SetCount(item->GetCount() - 1); PointChange(POINT_GOLD, iGoldValue0, true); } /// Goldbarren Area END
|
|
|
08/12/2015, 16:58
|
#12
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Aber eher so an einer Stelle:
Code:
if ((iGoldValue0 + GetGold()) >= g_llMaxGold || (iGoldValue0 + GetGold()) < 0)
Weil man ja in value0 Minuswerte eintragen kann
|
|
|
08/15/2015, 11:54
|
#13
|
elite*gold: 0
Join Date: Dec 2014
Posts: 1,015
Received Thanks: 498
|
hmm das themen titel ist ja mal lustig.
vielen dank für das hilfreiche release, werde es aufjedenfall benutzen.
|
|
|
08/15/2015, 15:06
|
#14
|
elite*gold: 23
Join Date: Jan 2012
Posts: 1,437
Received Thanks: 2,438
|
Super , danke
|
|
|
Similar Threads
|
[Geburtstags-RLS][Cplusplus] Extra Rang bei Level und einem Extra
03/07/2016 - Metin2 PServer Guides & Strategies - 28 Replies
Hallöchen Epvp,
Da ich heute Geburtstag habe und desswegen vor freude was Releasen muss.
Zum Release, also Man bekommt levelabhängig einen Rang, so was ähnliches gab es jezt erst vor kurzem leider daher finde ich auch das es an der Zeit wird ;)
Legen wir mal los in der InstanceBaseEffect.cpp:
|
All times are GMT +2. The time now is 09:23.
|
|