noisiv 1
noisiv
Manwe Work 1
Manwe Work
Can Öcalan 1
Can Öcalan
mavzermete 1
mavzermete
farkmt2official 1
farkmt2official
Sevdamsın 1
Sevdamsın
Hikaye Ekle

[C++] Pet'e İsim Vermek

  • Konuyu başlatan Konuyu başlatan kralcocuk
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 16
  • Görüntüleme Görüntüleme 4K

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

Selamlar.

Kendim için yaptığım ufak bir eklenti. Kullanmak isteyen olur mu bilmem, paylaşması benden gerisi size kalmış.
Pet atak ve level sistemlerini de paylaşmayı düşünüyorum.





Not: Aşağıda yazılı olan tüm kodları satır kayması olmadan alabilirsiniz.

petsystem.cpp açın

en başta bulun:
Kod:
#include "item.h"

altına ekleyin

Kod:
#include "db.h"

bulun:
Kod:
void CPetActor::SetName(const char* name)

kod bloğunu silip aşağıdaki şekilde değiştirin:

Kod:
void CPetActor::SetName(const char* name)
{
	std::string petName = m_pkOwner->GetName();

	if (0 != m_pkOwner && 
		0 == name && 
		0 != m_pkOwner->GetName())
	{
		petName += "'s Pet";
	}
	else
		petName += name;
	
	char sorgu[512];
	snprintf(sorgu, sizeof(sorgu), "SELECT name FROM pet_name WHERE id = %u", m_pkOwner->GetPlayerID());
	std::auto_ptr<SQLMsg> cekgelsin( DBManager::instance().DirectQuery(sorgu) );
	if (cekgelsin->Get()->uiNumRows != 0)
	{
		MYSQL_ROW row = mysql_fetch_row(cekgelsin->Get()->pSQLResult);
		char petad[CHARACTER_NAME_MAX_LEN + 1];
		strlcpy(petad, row[0], sizeof(petad));
		petName = petad;
	}
	
	if (true == IsSummoned())
		m_pkChar->SetName(petName);
	
	m_name = petName;
}

questlua_pet.cpp açın

en başa ekleyin
Kod:
#include "db.h"


bulun

Kod:
	int pet_spawn_effect(lua_State* L)

kod bloğunun altına ekleyin:

Kod:
	int pet_namever(lua_State* L)
	{
		LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr()  ;

		if ( lua_isstring(L, 1) != true )
		{
			lua_pushnumber(L, 1);
			return 1;
		}
		
		const char * szName = lua_tostring(L, 1);
		
		char sorgu[512];
		snprintf(sorgu, sizeof(sorgu), "REPLACE INTO pet_name VALUES(%u, '%s')", ch->GetPlayerID(), szName);
		std::auto_ptr<SQLMsg> yolla( DBManager::instance().DirectQuery(sorgu) );
		if (yolla->Get()->uiAffectedRows != 0)
		{
			lua_pushboolean(L, 3);
			return 3;
		}
		
		return 4;
	}

bulun

Kod:
			{ "spawn_effect",	pet_spawn_effect	},

altına ekleyin

Kod:
			{ "adver",			pet_namever			},



Game src ile işimiz bitti kapatabilirsiniz.

Navicat tablosu için mysql query kodu :

Eklemek için Navicat giriş yaptıktan sonra üst menüde "Query" göreceksiniz, ona tıklayın

Kod:
DROP TABLE IF EXISTS `pet_name`;
CREATE TABLE `pet_name` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(24) CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL DEFAULT 'NONAME',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci;

Quest_functions içine ekleyin
Kod:
pet.adver

Quest:

Kod:
quest ademin begin
    state start begin
        when 71115.use begin
			say_title("yeni isim ver")
			local str = input()
			if str == "" or str == nill then
				say_title("Kutuyu bos birakma")
				return
			end

			if string.len(str) <= 0 or string.len(str) > 12 then
				say_title("isim en fazla 12 karakter olabilir")
				return
			end
			
			local tt = "%'"
			local ct = "%:"
			local nk = "%."
			local vg = "%,"
			if string.find(str, tt) or string.find(str, ct) or string.find(str, nk) or string.find(str, vg) then
				say_title("ozel isaret kullanamazsin")
				return
			end
			
			local t = pet.adver(str)
			say_title("pet adi degistirildi. peti gonder")
			if t == 1 then
				say_title("kutuyu bos bırakma")
				return
			elseif t == 2 then
				say_title("12 karakteri gecme")
				return
			elseif t == 3 then
				say_title("isim degisti")
			end
		end
	end
end


Quest içinde lua dilinin string özelliğini kullandım, aşağıda gördüğünüz şekilde özel karakterleri bulup engelleyebilirsiniz.
Türkçe karakterleri engellemiştim kaldırdım, verdiğim kodlar da tr karakter problemi yoktur.
Kod:
local tt = "%'"
			local ct = "%:"
			local nk = "%."
			local vg = "%,"


Yukarıda :
tt > tek tırnak işareti
ct > iki nokta üst üste
nk > tek nokta
vg > virgül

aynı şekilde diğer karakterleri (yıldız sharp vs.) engellersiniz.


Verilen pet ismi tüm petler için geçerlidir.
Kodları değiştirdim, normal kodlarda verilen isim anında petin üstünde yazıyor fakat her pet için ayrı ayrı yapmamız gerekiyor bu da gereksiz diye düşündüm.


Not: Pet ismi quest içinde maximum 12 karakter olarak ayarlı ama mysql tablosu 24 karaktere kadar açık.
İsterseniz 12'yi değiştirip 24'e kadar çıkarabilirsiniz.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst