Register for your free account! | Forgot your password?

You last visited: Today at 09:23

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Release][Cplusplus] Yangbarren

Discussion on [Release][Cplusplus] Yangbarren within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #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
.K0rí is offline  
Thanks
12 Users
Old 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
Lefloyd is offline  
Thanks
1 User
Old 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?
rollback is offline  
Thanks
1 User
Old 08/12/2015, 09:06   #4
 
elite*gold: 2785
Join Date: Dec 2014
Posts: 403
Received Thanks: 1,354
Quote:
Originally Posted by Lefloyd View Post
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
.K0rí is offline  
Old 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
Lefloyd is offline  
Thanks
1 User
Old 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 View Post
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
rollback is offline  
Thanks
1 User
Old 08/12/2015, 09:22   #7
 
Jоe's Avatar
 
elite*gold: 0
Join Date: Aug 2012
Posts: 749
Received Thanks: 188
Warum const?
Jоe is offline  
Thanks
1 User
Old 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?
.Kibito is offline  
Thanks
1 User
Old 08/12/2015, 16:36   #9
 
.Risan.'s Avatar
 
elite*gold: 30
Join Date: Jul 2010
Posts: 1,627
Received Thanks: 1,450
wieso nimmst nicht PointChange ? da als Type das Yang übergeben...
.Risan. is offline  
Old 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. View Post
wieso nimmst nicht PointChange ? da als Type das Yang übergeben...
Quote:
Originally Posted by .K0rí View Post
Code:
int CHARACTER::ChangeGold(long gold)
{

	DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, GetPlayerID(), gold);
	PointChange(POINT_GOLD, gold, true);
}
nutzt er doch
rollback is offline  
Thanks
1 User
Old 08/12/2015, 16:48   #11
 
.Risan.'s Avatar
 
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_GOLDiGoldValue0true);
    }
    
/// Goldbarren Area END 
.Risan. is offline  
Thanks
3 Users
Old 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
rollback is offline  
Old 08/15/2015, 11:54   #13
 
BizepsSupportAccount's Avatar
 
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.
BizepsSupportAccount is offline  
Old 08/15/2015, 15:06   #14
 
Da' Real Ano's Avatar
 
elite*gold: 23
Join Date: Jan 2012
Posts: 1,437
Received Thanks: 2,438
Super , danke
Da' Real Ano is offline  
Reply


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.