Yardım textTail fonksiyonları Hakkında

Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

deadlymans

Üye
Üye
Mesaj
28
Çözümler
1
Beğeni
10
Puan
658
Ticaret Puanı
0
Merhaba texttail fonksiyonları ne işe yarıyor nasıl kullanılıyor mesela texttail.Pick(x,y)
[ Edit:(texttail.Pick(x,y) in ne işe yaradığını öğrendim x ve y değerleri oyunun görüntülendiği ekranın kordinatlarını temsil ediyor bu fonksiyonda yerdeki itemlerin oyun içi kordinatlarını değil de 2 boyutta ekrandaki kordinatlarını veriyor dolayısıyla sağa sola hareket etmeden bakınmak bile kordinatları değiştiriyor. Bu fonksiyonun eşitliği ise kordinatta gözlemlenen itemin vid değerini çıktı olarak veriyor. ) ]

Konuya ek olarak merak ettiğim yere düşen itemlerin kordinat bilgisini alabileceğim bir fonksiyon var mı?

Kod:
texttail.ArrangeTextTail
texttail.AttachTitle
texttail.Clear
texttail.EnablePKTitle
texttail.GetPosition
texttail.HideAllTextTail
texttail.IsChat
texttail.Pick
texttail.RegisterCharacterTextTail
texttail.RegisterChatTail
texttail.RegisterInfoTail
texttail.Render
texttail.SelectItemName
texttail.ShowAllTextTail
texttail.ShowCharacterTextTail
texttail.ShowItemTextTail
texttail.UpdateAllTextTail
texttail.UpdateShowingTextTail
 
Son düzenleme:
Elinizde source dosyaları varsa bu fonksiyonların bulunduğu kısımları okuyarak az çok ne işe yaradığını kestirebilirsiniz.
 
Az çok anladım da bir şey aklıma takıldı oyunda yere düşen itemlerin kordinat bilgisi nerede tutuluyor bunu çağırabilir miyim.
 
Oyunda yere düşen itemin fare ile tıklayarak alınan kısmı soruyorsanız app.GetCursorPosition() ile farenin kordinatlarını alıyor ve item bilgilerini çekiyor. Yere düşen itemlerin koordinat bilgisinin olması lazım ama nerede bilmiyorum. Kodları bi inceleyim. Bir şey bulursam yazarım
 
Şimdi kaynak kodlarını analiz ediyordum. Yerde bulunan itemler oyuna entitiy olarak kayıt ediliyor. Daha net anlamanız için size kodları paylaşıyorum.
char_item.cpp
C++:
bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount)
{
    LPITEM item = NULL;

    if (!CanHandleItem())
    {
        if (NULL != DragonSoul_RefineWindow_GetOpener())
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
        return false;
    }

    if (IsDead())
        return false;

    if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
        return false;

    if (item->IsExchanging())
        return false;

    if (true == item->isLocked())
        return false;

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
        return false;

    if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_DROP | ITEM_ANTIFLAG_GIVE))
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("버릴 수 없는 아이템입니다."));
        return false;
    }

    if (bCount == 0 || bCount > item->GetCount())
        bCount = item->GetCount();

    SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255);    // Quickslot 에서 지움

    LPITEM pkItemToDrop;

    if (bCount == item->GetCount())
    {
        item->RemoveFromCharacter();
        pkItemToDrop = item;
    }
    else
    {
        if (bCount == 0)
        {
            if (test_server)
                sys_log(0, "[DROP_ITEM] drop item count == 0");
            return false;
        }

        item->SetCount(item->GetCount() - bCount);
        ITEM_MANAGER::instance().FlushDelayedSave(item);

        pkItemToDrop = ITEM_MANAGER::instance().CreateItem(item->GetVnum(), bCount);

        // copy item socket -- by mhh
        FN_copy_item_socket(pkItemToDrop, item);

        char szBuf[51 + 1];
        snprintf(szBuf, sizeof(szBuf), "%u %u", pkItemToDrop->GetID(), pkItemToDrop->GetCount());
        LogManager::instance().ItemLog(this, item, "ITEM_SPLIT", szBuf);
    }

    PIXEL_POSITION pxPos = GetXYZ();

    if (pkItemToDrop->AddToGround(GetMapIndex(), pxPos))
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("떨어진 아이템은 3분 후 사라집니다."));
        pkItemToDrop->StartDestroyEvent();

        ITEM_MANAGER::instance().FlushDelayedSave(pkItemToDrop);

        char szHint[32 + 1];
        snprintf(szHint, sizeof(szHint), "%s %u %u", pkItemToDrop->GetName(), pkItemToDrop->GetCount(), pkItemToDrop->GetOriginalVnum());
        LogManager::instance().ItemLog(this, pkItemToDrop, "DROP", szHint);
        //Motion(MOTION_PICKUP);
    }

    return true;
}

AddToGround fonksiyonununa bakıyoruz şimdi;
item.cpp;
C++:
bool CItem::AddToGround(long lMapIndex, const PIXEL_POSITION & pos, bool skipOwnerCheck)
{
    if (0 == lMapIndex)
    {
        sys_err("wrong map index argument: %d", lMapIndex);
        return false;
    }

    if (GetSectree())
    {
        sys_err("sectree already assigned");
        return false;
    }

    if (!skipOwnerCheck && m_pOwner)
    {
        sys_err("owner pointer not null");
        return false;
    }

    LPSECTREE tree = SECTREE_MANAGER::instance().Get(lMapIndex, pos.x, pos.y);

    if (!tree)
    {
        sys_err("cannot find sectree by %dx%d", pos.x, pos.y);
        return false;
    }

    //tree->Touch();

    SetWindow(GROUND);
    SetXYZ(pos.x, pos.y, pos.z);
    tree->InsertEntity(this);
    UpdateSectree();
    Save();
    return true;
}

Bu da şu anlama geliyor. Entity bilgilerini alan kodlar büyük ihtimal yerde ki itemlerin bilgilerini de alıyor.
 
Vardır. O verdiğiniz kodu deneyin. Şimdi server kısmını ve yere düşen itemlerin hangi türde saklandığını öğrendik. Entity olarak saklandığından dolayı moblar, npcler, oyuncu karakterlerinde olduğu gibi aynı mantıkla sistem cliente gönderiyor.

texttail.GetPosition şu komut ile mevcut texttailleri alabiliyoruz. Ama ondan önce entitynin index değerini almak gerekiyor
 
Son düzenleme:
GetTextTailPosition(VirtualID, &x, &y, &z) oyun kaynak kodlarını kurcalayarak bu kullanıma ulaştım , burada VirtualID item id değeri mi ve x y z değerleri çıktı olarak mı veriliyor giriş olarak mı alınıyor onu pek anlayamadım.
 
Kodlara göre entity id istiyor. Normal karakterlerin ve itemler vid değeri olur. Aynı onun gibi. Şöyle bir şey var. Bilgisini almak istediğimiz itemin vid değerini almak gerekiyor
 
x, y ve z belirtmenize gerek yok. Sadece vid verirseniz yeterli olacağını düşünüyorum. Aşağıda verdiğim kod. Belirttiğiniz fonksiyonun c++ kodları. Burada da vid değerini verirseniz size 3 boyutlu düzenlemin koordinat bilgilerini verecek.
C++:
PyObject * textTailGetPosition(PyObject * poSelf, PyObject * poArgs)
{
    int VirtualID;
    if (!PyTuple_GetInteger(poArgs, 0, &VirtualID))
        return Py_BuildException();

    float x=0.0f;
    float y=0.0f;
    float z=0.0f;
    bool isData=CPythonTextTail::Instance().GetTextTailPosition(VirtualID, &x, &y, &z);
    if (!isData)
    {
        CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
        CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
        if (pkInstMain)
        {
            const D3DXVECTOR3 & c_rv3Position = pkInstMain->GetGraphicThingInstanceRef().GetPosition();
            CPythonGraphic::Instance().ProjectPosition(c_rv3Position.x, c_rv3Position.y, c_rv3Position.z, &x, &y);
        }
    }

    return Py_BuildValue("fff", x, y, z);
}
 
Tamam teşekkür ederim denedim fakat sonuca ulaşamadım her şey için teşekkür ederim şimdilik başaramasam da sayenizde çok şey öğrendim.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst