Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
CerfiN

NPC_SLEEPING sistemini aktifleştirme (priest uyutma skilli)

Önerilen Mesajlar

Uzun zamandır source a bakmaya fırsatım olmadı ufaktan ufaktan bakıyorum göz ucuyla. Şu çalışmayan uyutma skilleri var priestin yavaş yavaş onunla uğraşıyorum. Aklımda ufak bi mantık geliştirdim GameServer'dan AI'ye paket atarak npc lerin ve mobların durumlarını değiştirip skilli çalıştırabilirim diye. Bi kaç fonksiyon yazmayı denedim kendimce yeni bir paket oluşturup da pek bi çözüme ulaşamadım. Yapan arkadaşlar nasıl bir yol izlediklerini yazabilirler mi bende eksikleri görüp ona göre hareket edeyim.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

Uzun zamandır source a bakmaya fırsatım olmadı ufaktan ufaktan bakıyorum göz ucuyla. Şu çalışmayan uyutma skilleri var priestin yavaş yavaş onunla uğraşıyorum. Aklımda ufak bi mantık geliştirdim GameServer'dan AI'ye paket atarak npc lerin ve mobların durumlarını değiştirip skilli çalıştırabilirim diye. Bi kaç fonksiyon yazmayı denedim kendimce yeni bir paket oluşturup da pek bi çözüme ulaşamadım. Yapan arkadaşlar nasıl bir yol izlediklerini yazabilirler mi bende eksikleri görüp ona göre hareket edeyim.

 


Önce yeni bir opcode tanımla. Örneğin;

#define AG_MONSTER_SET_SLEEP 0xCC

Daha sonra paket yapısını oluştur.

 

 

Packet result(AG_MONSTER_SET_SLEEP);
result <GetID()) ; // Uyutulacak/uyandırılacak npc idsi
result << uint8(1); // 1 = uyuyor / 0 = uyanık
g_pMain->Send2AI(result); // ai server'a gönder
(pnpc->


AIServer paket handler fonksiyonuna yeni opcode için case ekle

 

case AG_MONSTER_SET_SLEEP:
{
uint16 sTargetNpcID = pkt.read();
uint8 status = pkt.read();
CNpc * pNpc = g_AIServer->GetNpcPtr(sTargetNpcID);
if(!pNpc) return;
pNpc->m_NpcState = status == 1 ? NPC_SLEEPING:NPC_STANDING;

}
break;



Fonksiyon adları farklılık gösterebilir, tamamen kafamda kurguladım.

Tabi, ufak bir detay daha var. NPC'nin bulunduğu regiona 'zzz' efektini göstermek amacıyla WIZ_STATE_CHANGE paketini de göndermen lazım.

Şimdiden kolay gelsin.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

Önce yeni bir opcode tanımla. Örneğin;

#define AG_MONSTER_SET_SLEEP 0xCC

Daha sonra paket yapısını oluştur.


Packet result(AG_MONSTER_SET_SLEEP);

result <GetID()) ; // Uyutulacak/uyandırılacak npc idsi

result << uint8(1); // 1 = uyuyor / 0 = uyanık

g_pMain->Send2AI(result); // ai server'a gönder

(pnpc->


AIServer paket handler fonksiyonuna yeni opcode için case ekle


case AG_MONSTER_SET_SLEEP:

{

uint16 sTargetNpcID = pkt.read();

uint8 status = pkt.read();

CNpc * pNpc = g_AIServer->GetNpcPtr(sTargetNpcID);

pNpc->m_NpcState = status == 1 ? NPC_SLEEPING:NPC_STANDING;



}

break;

 


Fonksiyon adları farklılık gösterebilir, tamamen kafamda kurguladım.

Tabi, ufak bir detay daha var. NPC'nin bulunduğu regiona 'zzz' efektini göstermek amacıyla WIZ_STATE_CHANGE paketini de göndermen lazım.

Şimdiden kolay gelsin.

 

 


Teşekkür ederim bu bilgiler doğrultusunda çalışmaya devam ediyorum.

 

İletiyi paylaş


Link to post
Sitelerde Paylaş

ExecuteType7 fonksiyonuna şu şekilde ekledim;
 

			else if (pType->bTargetChange == 2 && pSkillTarget->isNPC())
			{
				Packet result(AG_MONSTER_SET_SLEEP);
				result << uint16(pSkillTarget->GetID());
				result << uint8(1);
				g_pMain->Send_AIServer(&result);
				return true;

 


Ardından AI>GameSocket.cpp ye HandlePacket kısmına şu şekilde bir fonksiyon oluşturarak ekledim;

 

 

 

 

	case AG_MONSTER_SET_SLEEP:
		StateChangeNpc(pkt);
                break;

 



En alta da fonksiyonu ekledim;

 

 

 

 

void CGameSocket::StateChangeNpc(Packet & pkt)
{

	uint16 sTargetNpcID = pkt.read();
	uint8 status = pkt.read();
	CNpc * pNpc = g_pMain->GetNpcPtr(sTargetNpcID);
	if (pNpc)
		pNpc->m_NpcState = status == 1 ? NPC_SLEEPING:NPC_STANDING;

}

 



Ancak çalışmadı. Biraz kurcaladığımda ise skilli bastığım mobun bir anda yeri değişiyor. Gözden kaçırdığım kısım neresi acaba?

 

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

ExecuteType7 fonksiyonuna şu şekilde ekledim;
 


			else if (pType->bTargetChange == 2 && pSkillTarget->isNPC())

			{

				Packet result(AG_MONSTER_SET_SLEEP);

				result << uint16(pSkillTarget->GetID());

				result << uint8(1);

				g_pMain->Send_AIServer(&result);

				return true;

 


Ardından AI>GameSocket.cpp ye HandlePacket kısmına şu şekilde bir fonksiyon oluşturarak ekledim;

 

 

 

 


	case AG_MONSTER_SET_SLEEP:

		StateChangeNpc(pkt);

                break;

 



En alta da fonksiyonu ekledim;

 

 

 

 


void CGameSocket::StateChangeNpc(Packet & pkt)

{



	uint16 sTargetNpcID = pkt.read();

	uint8 status = pkt.read();

	CNpc * pNpc = g_pMain->GetNpcPtr(sTargetNpcID);

	if (pNpc)

		pNpc->m_NpcState = status == 1 ? NPC_SLEEPING:NPC_STANDING;



}

 



Ancak çalışmadı. Biraz kurcaladığımda ise skilli bastığım mobun bir anda yeri değişiyor. Gözden kaçırdığım kısım neresi acaba?

 

 


NPC_SLEEPING durumu için tanımlanmış bir fonksiyon var mı?

 

İletiyi paylaş


Link to post
Sitelerde Paylaş
time_t CNpc::NpcSleeping()
{
	if (UNIXTIME < m_tFaintingTime) 
		return m_sStandTime;

	m_NpcState = NPC_SLEEPING;
	m_tFaintingTime = 0;

	Packet result(AG_MONSTER_SET_SLEEP);
	result << uint16(GetID()) << uint8(1);
	return false;
}

 


Bu fonksiyon var dı paket eklenmemişti şimdi ekledim. Tekli skilli kullandığımda mob duruyor ama geri çözülmüyor o şekilde kalıyor.

 

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

time_t CNpc::NpcSleeping()

{

	if (UNIXTIME < m_tFaintingTime) 

		return m_sStandTime;



	m_NpcState = NPC_SLEEPING;

	m_tFaintingTime = 0;



	Packet result(AG_MONSTER_SET_SLEEP);

	result << uint16(GetID()) << uint8(1);

	return false;

}

 


Bu fonksiyon var dı paket eklenmemişti şimdi ekledim. Tekli skilli kullandığımda mob duruyor ama geri çözülmüyor o şekilde kalıyor.

 

 


Timer'e bağla type7check filan diye. süresi bitince eski standing yapsın.

 

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

Timer'e bağla type7check filan diye. süresi bitince eski standing yapsın.

 


Olabilir skill sonunda eski state'e dönmeside olabilir kurcalıyorum henüz.

 

İletiyi paylaş


Link to post
Sitelerde Paylaş

WIZ_STATE_CHANGE paketini göndericem ama içinde bir çok case var StateChangeServerDirect fonksiyonu altında. Yeni bir case oluşturacağım da efekt vermesi açısından ne yazacağım bilmiyorum kastettiğiniz bu kısım mı acaba?
@ PENTAGRAM

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

time_t CNpc::NpcSleeping()

{

	if (UNIXTIME < m_tFaintingTime) 

		return m_sStandTime;



	m_NpcState = NPC_SLEEPING;

	m_tFaintingTime = 0;



	Packet result(AG_MONSTER_SET_SLEEP);

	result << uint16(GetID()) << uint8(1);

	return false;

}

 


Bu fonksiyon var dı paket eklenmemişti şimdi ekledim. Tekli skilli kullandığımda mob duruyor ama geri çözülmüyor o şekilde kalıyor.

 

 


Paket oraya eklenmeyecek, ki gördüğün üzere AIServer içerisindesin, ve yarattığın paketi göndermemişsin dahi. Aşağıdaki blogu fonksiyondan kaldır.

 

 


Packet result(AG_MONSTER_SET_SLEEP);

	result << uint16(GetID()) << uint8(1);

	return false;



NPC'yi tekrardan uyandırmak için yine gameserver'dan paket göndermen gerekecek. NPC saldırı aldığında, AIServer'a paket gidiyor olması lazım zaten. O paketin handler fonksiyonu içerisinde, eğer NPC durumu sleeping ise, durumu NPC_STANDING olarak ayarlamalısın.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

Paket oraya eklenmeyecek, ki gördüğün üzere AIServer içerisindesin, ve yarattığın paketi göndermemişsin dahi. Aşağıdaki blogu fonksiyondan kaldır.


Packet result(AG_MONSTER_SET_SLEEP);

	result << uint16(GetID()) << uint8(1);

	return false;

 


NPC'yi tekrardan uyandırmak için yine gameserver'dan paket göndermen gerekecek. NPC saldırı aldığında, AIServer'a paket gidiyor olması lazım zaten. O paketin handler fonksiyonu içerisinde, eğer NPC durumu sleeping ise, durumu NPC_STANDING olarak ayarlamalısın.

 

 


NPC'nin saldırı aldığında AI'ye nasıl paket gönderdiğini bulamadım. Mobları uyuttuktan sonra ilk dalışımda oda bana dalıyor ama tekrar uyuttuğumda dalmıyor.

 

İletiyi paylaş


Link to post
Sitelerde Paylaş

Hey friend,can you tell me how to cancel the 'zzz' effect? i just know how to send 'zzz' effect to the monster。Thanks.:)



How do I send the effect I have not done it yet :)

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
NPC'nin saldırı aldığında AI'ye nasıl paket gönderdiğini bulamadım. Mobları uyuttuktan sonra ilk dalışımda oda bana dalıyor ama tekrar uyuttuğumda dalmıyor.


Aslında AI'ye zaten paket gidiyor. O yüzden saldırı aldığında, AIServer'a otomatik olarak NPC'yi uyandırmasının söyleyebilirsin.

Kendi altyapımda aiserver-gameserver birleşik olduğu için, elimde var olan başka bir source üzerinden anlatacağım.

void CNpc::RecvAttackReq(int nDamage, uint16 sAttackerID, AttributeType attributeType /*= AttributeNone*/)

{
if (isDead()
|| nDamage return;

Unit * pAttacker = g_pMain->GetUnitPtr(sAttackerID);

if (pAttacker != nullptr
&& pAttacker->isPlayer())
{
Guard lock(m_damageListLock);
m_DamagedUserList[pAttacker->GetID()] += nDamage;
}

m_TotalDamage += nDamage;
HpChange(-nDamage, pAttacker, false);

if (pAttacker == nullptr)
return;

if (!pAttacker->isPlayer())
{
ChangeNTarget(TO_NPC(pAttacker));
return;
}

if (attributeType == AttributeLightning
&& m_NpcState != NPC_FAINTING)
{
int iRandom = myrand(1, 100);
int iLightningR = (int)(10 + (40 - 40 * ((double)m_sLightningR / 80)));
if (COMPARE(iRandom, 0, iLightningR))
{
m_NpcState = NPC_FAINTING;
m_Delay = 0;
m_tFaintingTime = UNIXTIME;
}
else
{
ChangeTarget(0, TO_USER(pAttacker));
}
}
}


Yukarıdaki fonksiyonun sonuna


if(m_NpcState == NPC_SLEEPING){
m_NpcState = NPC_STANDING;
ChangeTarget(0, TO_USER(pAttacker));
}


kodunu eklersen, NPC saldırı aldığında NPC state eğer NPC_SLEEPING ise, state NPC_STANDING olarak güncellenecek, ve daha sonra ChangeTarget fonksiyonu tetiklenecektir (NPC_ATTACKING, NPC_FIGHTING bu fonksiyon tarafından ayarlanır)

Sonuç :

Spoiler



void CNpc::RecvAttackReq(int nDamage, uint16 sAttackerID, AttributeType attributeType /*= AttributeNone*/)
{
if (isDead()
|| nDamage return;

Unit * pAttacker = g_pMain->GetUnitPtr(sAttackerID);

if (pAttacker != nullptr
&& pAttacker->isPlayer())
{
Guard lock(m_damageListLock);
m_DamagedUserList[pAttacker->GetID()] += nDamage;
}

m_TotalDamage += nDamage;
HpChange(-nDamage, pAttacker, false);

if (pAttacker == nullptr)
return;

if (!pAttacker->isPlayer())
{
ChangeNTarget(TO_NPC(pAttacker));
return;
}

if (attributeType == AttributeLightning
&& m_NpcState != NPC_FAINTING)
{
int iRandom = myrand(1, 100);
int iLightningR = (int)(10 + (40 - 40 * ((double)m_sLightningR / 80)));
if (COMPARE(iRandom, 0, iLightningR))
{
m_NpcState = NPC_FAINTING;
m_Delay = 0;
m_tFaintingTime = UNIXTIME;
}
else
{
ChangeTarget(0, TO_USER(pAttacker));
}
}
if(m_NpcState == NPC_SLEEPING){
m_NpcState = NPC_STANDING;
ChangeTarget(0, TO_USER(pAttacker));
}
}

İletiyi paylaş


Link to post
Sitelerde Paylaş

Hey friend,can you tell me how to cancel the 'zzz' effect? i just know how to send 'zzz' effect to the monster。Thanks.:)





I've solved it by myself,thank you.
-- mesaja ek olarak --
Alıntı
How do I send the effect I have not done it yet :)


send a packet with "WIZ_STATE_CHANGE" opcode,type 4 is sleep.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Aslında AI'ye zaten paket gidiyor. O yüzden saldırı aldığında, AIServer'a otomatik olarak NPC'yi uyandırmasının söyleyebilirsin.

Kendi altyapımda aiserver-gameserver birleşik olduğu için, elimde var olan başka bir source üzerinden anlatacağım.

void CNpc::RecvAttackReq(int nDamage, uint16 sAttackerID, AttributeType attributeType /*= AttributeNone*/)

{
if (isDead()
|| nDamage return;

Unit * pAttacker = g_pMain->GetUnitPtr(sAttackerID);

if (pAttacker != nullptr
&& pAttacker->isPlayer())
{
Guard lock(m_damageListLock);
m_DamagedUserList[pAttacker->GetID()] += nDamage;
}

m_TotalDamage += nDamage;
HpChange(-nDamage, pAttacker, false);

if (pAttacker == nullptr)
return;

if (!pAttacker->isPlayer())
{
ChangeNTarget(TO_NPC(pAttacker));
return;
}

if (attributeType == AttributeLightning
&& m_NpcState != NPC_FAINTING)
{
int iRandom = myrand(1, 100);
int iLightningR = (int)(10 + (40 - 40 * ((double)m_sLightningR / 80)));
if (COMPARE(iRandom, 0, iLightningR))
{
m_NpcState = NPC_FAINTING;
m_Delay = 0;
m_tFaintingTime = UNIXTIME;
}
else
{
ChangeTarget(0, TO_USER(pAttacker));
}
}
}


Yukarıdaki fonksiyonun sonuna


if(m_NpcState == NPC_SLEEPING){
m_NpcState = NPC_STANDING;
ChangeTarget(0, TO_USER(pAttacker));
}


kodunu eklersen, NPC saldırı aldığında NPC state eğer NPC_SLEEPING ise, state NPC_STANDING olarak güncellenecek, ve daha sonra ChangeTarget fonksiyonu tetiklenecektir (NPC_ATTACKING, NPC_FIGHTING bu fonksiyon tarafından ayarlanır)

Sonuç :

Spoiler



void CNpc::RecvAttackReq(int nDamage, uint16 sAttackerID, AttributeType attributeType /*= AttributeNone*/)
{
if (isDead()
|| nDamage return;

Unit * pAttacker = g_pMain->GetUnitPtr(sAttackerID);

if (pAttacker != nullptr
&& pAttacker->isPlayer())
{
Guard lock(m_damageListLock);
m_DamagedUserList[pAttacker->GetID()] += nDamage;
}

m_TotalDamage += nDamage;
HpChange(-nDamage, pAttacker, false);

if (pAttacker == nullptr)
return;

if (!pAttacker->isPlayer())
{
ChangeNTarget(TO_NPC(pAttacker));
return;
}

if (attributeType == AttributeLightning
&& m_NpcState != NPC_FAINTING)
{
int iRandom = myrand(1, 100);
int iLightningR = (int)(10 + (40 - 40 * ((double)m_sLightningR / 80)));
if (COMPARE(iRandom, 0, iLightningR))
{
m_NpcState = NPC_FAINTING;
m_Delay = 0;
m_tFaintingTime = UNIXTIME;
}
else
{
ChangeTarget(0, TO_USER(pAttacker));
}
}
if(m_NpcState == NPC_SLEEPING){
m_NpcState = NPC_STANDING;
ChangeTarget(0, TO_USER(pAttacker));
}
}



Teşekkür ederim ben direk olarak NpcSleeping içerisine ufak bir eklenti yapmıştım şu şekilde;

	if (m_Target.id = m_TotalDamage > 0)

{
m_NpcState = NPC_STANDING;
m_Delay = 0;
}


tabi bu direk olarak uyandırıyordu olmadı çeviricem diğer koda.

İletiyi paylaş


Link to post
Sitelerde Paylaş

Şu efekt mevzunu hala anlamadım. WIZ_STATE_CHANGE'i gönderirken npc uyuyorsa ona göre state durumunu yapmaya çalıştım da hala efekt vermedi. Zaten Type7 de ki alan skilleri çalışmıyor proveke de öyle. Muhtemelen efekt olmadığından.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Admin
Alıntı
Şu efekt mevzunu hala anlamadım. WIZ_STATE_CHANGE'i gönderirken npc uyuyorsa ona göre state durumunu yapmaya çalıştım da hala efekt vermedi. Zaten Type7 de ki alan skilleri çalışmıyor proveke de öyle. Muhtemelen efekt olmadığından.


AIServer üzerinde çalışıyorum şuan sıfırdan sade bir AIServer yazıyorum kendi kafama göre aslında mantığın tam nasıl olduğunu açıklayayım.

En başta AIServer.cpp THREADCALL içerisindeki döngünün başında isSleeping() kontrolüyle bakıyorum eğer ki Unit uyuyor ise herhangi bir işleme tabi tutmuyorum. Çünkü uyuduğu anda ne attack yapıyor ne yürüyor ne de etrafında düşman arıyor.

İkinci bir olay ise bende AIServer diye bir program yok birleşik olduğu için söyle anlatayım siz onu AIServer bildirmek zorundasınız. Siz Unite attack yaptığınızda HpChange olur yada hangi fonksiyonu kullanıyorsanız onun içerisine NpcState değerini değiştireceksiniz artık Sleeping olarak çıkacak.
Çıktıktan sonra yine AIServer.cpp içerisinde kontrole yakalanmayacak ve normal hareketlerine devam edecek yani uyanmış olacak.

Tabi uyuduğunu etrafa göstermek zorundasın bunun içinde uyutma skillini kullandığında nerede ne tetikleniyor dosyalarda neresinde switch case ile kontrol ediyor o skilli bulacaksın ondan sonra WIZ_STATE_CHANGE paketini atacaksın. Aşağıda vereceğim o sistemi ona göre bakarsınız.

Oyun içerisinde şöyle bir sıkıntı var eğer ki sen herhangi bir Unit'i uyutursan ve sonradan region dışı biri gelip Unit'i görürse onun uyuduğunu göremiyor. Böyle bir paket gitmiyor yani NPC_INOUT paketlerinin içerisinde uyuduğunu gösterecek herhangi bir değer yok. Yani town atmış yada sonradan yanına gelen birisi göremeyecek. Bunun içinde ben NPC_INOUT paketlerini gönderirken gönderdiği Unit SocketID std::set içerisine atıyorum. Ardından tüm NPC_INOUT gönderildikten sonra client taraflı bir paket tanımladım .dll yöntemiyle bunu siz tabi tek tek gönderebilirsiniz. Uyuyan Unit'leri sonradan etraftaki clientlere algılatıyorum.

Yani bu ne işe yarıyor. Ben wormu uyuttum ardından town attım geri geldim normalde worm hala uyuması gerekiyorken bende uyumuyor olarak gözüküyor. Kafasında zzZZ effecti çıkmıyor. Bu olay bunu engelliyor ve sorunsuz hale getiriyor.

Gizli İçerik

    Gizli içeriği görmek için bu konuya bir mesaj yazın.

İletiyi paylaş


Link to post
Sitelerde Paylaş

Şuan birkez daha girip denedim ve bende olay şöyle. Yaratıkları tekli skill ile uyutuyorum uyuyorlar ve ben atak yapınca yada süresi bitince çözülüyorlar. Farklı zone dan farklı charlarla geçtiğim de yine aynı şekilde yaratıkları uyuyor olarak görüyorum. Ama efekt çıkmıyor ve toplu olarak uyutma şu anda aktif değil. Yukarıda ki fonksiyon üzerinde tekrar gözden geçiricem şu aralar BDW konusun da çalışıyordum o bitti sayılır tekrar dan bu konuya dönücem ama mantığımda tam oturması lazım.

@ OzkanOzdemir

İletiyi paylaş


Link to post
Sitelerde Paylaş
Admin
Alıntı
Şuan birkez daha girip denedim ve bende olay şöyle. Yaratıkları tekli skill ile uyutuyorum uyuyorlar ve ben atak yapınca yada süresi bitince çözülüyorlar. Farklı zone dan farklı charlarla geçtiğim de yine aynı şekilde yaratıkları uyuyor olarak görüyorum. Ama efekt çıkmıyor ve toplu olarak uyutma şu anda aktif değil. Yukarıda ki fonksiyon üzerinde tekrar gözden geçiricem şu aralar BDW konusun da çalışıyordum o bitti sayılır tekrar dan bu konuya dönücem ama mantığımda tam oturması lazım.

@ OzkanOzdemir


İşte aslında uyuyorlar ama sonradan gelen yani town atan dediğimiz kişiler zzZZ effectini görmüyorlar. Bunun için tekrardan yukarıda yaptığım gibi WIZ_STATE_CHANGE paketi atman gerekiyor böylelikle sorunsuz hale geliyor.
Benim bir sorum var ben mesela baştan AIServer dosyalarını yazdığım için uyuma süresini eklemedim ne kadar sürüyor uyumaları kendilerine gelmeleri yani?

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
İşte aslında uyuyorlar ama sonradan gelen yani town atan dediğimiz kişiler zzZZ effectini görmüyorlar. Bunun için tekrardan yukarıda yaptığım gibi WIZ_STATE_CHANGE paketi atman gerekiyor böylelikle sorunsuz hale geliyor.
Benim bir sorum var ben mesela baştan AIServer dosyalarını yazdığım için uyuma süresini eklemedim ne kadar sürüyor uyumaları kendilerine gelmeleri yani?


20 saniye sürüyor uyumaları ve kendine gelmeleri zaten yanlış hatırlamıyorsam skill süresi o kadar. Bende şu an 20 saniye olarak ayarlı. İşte bende sorun zzz efekti komple yok orda kalmıştım en son.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
AIServer üzerinde çalışıyorum şuan sıfırdan sade bir AIServer yazıyorum kendi kafama göre aslında mantığın tam nasıl olduğunu açıklayayım.

En başta AIServer.cpp THREADCALL içerisindeki döngünün başında isSleeping() kontrolüyle bakıyorum eğer ki Unit uyuyor ise herhangi bir işleme tabi tutmuyorum. Çünkü uyuduğu anda ne attack yapıyor ne yürüyor ne de etrafında düşman arıyor.

İkinci bir olay ise bende AIServer diye bir program yok birleşik olduğu için söyle anlatayım siz onu AIServer bildirmek zorundasınız. Siz Unite attack yaptığınızda HpChange olur yada hangi fonksiyonu kullanıyorsanız onun içerisine NpcState değerini değiştireceksiniz artık Sleeping olarak çıkacak.
Çıktıktan sonra yine AIServer.cpp içerisinde kontrole yakalanmayacak ve normal hareketlerine devam edecek yani uyanmış olacak.

Tabi uyuduğunu etrafa göstermek zorundasın bunun içinde uyutma skillini kullandığında nerede ne tetikleniyor dosyalarda neresinde switch case ile kontrol ediyor o skilli bulacaksın ondan sonra WIZ_STATE_CHANGE paketini atacaksın. Aşağıda vereceğim o sistemi ona göre bakarsınız.

Oyun içerisinde şöyle bir sıkıntı var eğer ki sen herhangi bir Unit'i uyutursan ve sonradan region dışı biri gelip Unit'i görürse onun uyuduğunu göremiyor. Böyle bir paket gitmiyor yani NPC_INOUT paketlerinin içerisinde uyuduğunu gösterecek herhangi bir değer yok. Yani town atmış yada sonradan yanına gelen birisi göremeyecek. Bunun içinde ben NPC_INOUT paketlerini gönderirken gönderdiği Unit SocketID std::set içerisine atıyorum. Ardından tüm NPC_INOUT gönderildikten sonra client taraflı bir paket tanımladım .dll yöntemiyle bunu siz tabi tek tek gönderebilirsiniz. Uyuyan Unit'leri sonradan etraftaki clientlere algılatıyorum.

Yani bu ne işe yarıyor. Ben wormu uyuttum ardından town attım geri geldim normalde worm hala uyuması gerekiyorken bende uyumuyor olarak gözüküyor. Kafasında zzZZ effecti çıkmıyor. Bu olay bunu engelliyor ve sorunsuz hale getiriyor.

*** hidden content ***


Teacher,
Add it to that place?

İletiyi paylaş


Link to post
Sitelerde Paylaş

×
×
  • Yeni Oluştur...