51 (edited by powachill4 2012-03-02 16:20:48)

Re: [CLIENT] H-Client v4.0.3

hey thats freaking nice!
but im missing some few things i would really like to see in the mod:

- inventory (to stack more items)
- crafting (would require a freehand slot, eg 0?)
- entity physics (let them fall down when they got dropped)
- doors ?
- trees ?
- [ different worlds, a normal teeworlds map is possibly to small... ]
- [ random map generator, if different worlds ]

#edit
- Spawn monsters randomly in the darkness (make a limit...)


But the very most important thing is...
Publish the sourcecode please. Wanted to learn from it, would really like it...

52

Re: [CLIENT] H-Client v4.0.3

- 1. + 2. Working on this smile
- 3. In future versions......
- 4. + 5. The time tell it...
- 6. You can make maps with a normal client editor... only need know how make it xDD
- 7. In future versions.....
- 8. Now the monster spawn in the dark... but dead why i need slots to animals...

In this version i will release source on github and linux binary wink

53

Re: [CLIENT] H-Client v4.0.3

6 -> No i meant something like.. A portal to nether and the end. But
I meant not only the Nether or The end, i meant other normal "worlds".
8 -> Modify a client and make them running as entities?


Ok, thanks to know bro.
And.. its a good mod. smile Hoped that someone will make it ^^

54

Re: [CLIENT] H-Client v4.0.3

is very interesting how the SERVER of your mod SEND maps changements (when a tee build or destroy something) to ALL CLIENTS ... i am glad if you can explain me how work it

anhother question: when you will release the code, somebody can will hack the DARK ZONE client side to look without fire light?

55 (edited by unsigned char* 2012-03-03 20:49:17)

Re: [CLIENT] H-Client v4.0.3

Hi CarmineZ, i included new messages in the protocol "network.py"...

    NetMessage("Sv_TileCreate", [
        NetIntAny("m_X"),
        NetIntAny("m_Y"),
        NetIntAny("m_ITile"),
        NetIntAny("m_State"),
        NetIntAny("m_Col"),
    ]),
    NetMessage("Sv_TileDestroy", [
        NetIntAny("m_X"),
        NetIntAny("m_Y"),
    ]),
    NetMessage("Sv_TileChangeExt", [
        NetIntAny("m_Index"),
        NetIntAny("m_X"),
        NetIntAny("m_Y"),
        NetIntAny("m_ITile"),
        NetIntAny("m_State"),
        NetIntAny("m_Col"),
        NetIntRange("m_Act", 'TILE_DESTROY', 'TILE_CREATE'),
    ]),

When Destroy...

            if (str_comp_nocase(GameServer()->GameType(), "MineTee") == 0 && g_Config.m_SvGameMode == 0)
            {
                vec2 colTilePos = ProjStartPos+Direction * 80.0f;
                if (GameServer()->Collision()->IntersectLine(ProjStartPos, colTilePos, &colTilePos, 0x0, false))
                {
                    vec2 finishPosPost = colTilePos+Direction * 16.0f;
                    if (GameServer()->Collision()->GetCollisionAt(finishPosPost.x, finishPosPost.y) == CCollision::COLFLAG_SOLID)
                    {
                        int TIndex = -1;
                        if ((TIndex = GameServer()->Collision()->DestroyTile(finishPosPost)) > 0)
                        {
                            CNetMsg_Sv_TileDestroy TileInfo;
                            TileInfo.m_X = static_cast<int>(finishPosPost.x/32.0f);
                            TileInfo.m_Y = static_cast<int>(finishPosPost.y/32.0f);
                            Server()->SendPackMsg(&TileInfo, MSGFLAG_VITAL, -1);

                            CPickup *pPickup = new CPickup(&GameServer()->m_World, POWERUP_BLOCK, TIndex);
                            pPickup->m_Pos = vec2(TileInfo.m_X*32.0f + 8.0f, TileInfo.m_Y*32.0f + 8.0f);
                            GameServer()->CreateSound(m_Pos, SOUND_DESTROY_BLOCK);
                        }

                        Hits++;
                    }
                }
            }

When Client get the message:

    if(MsgType == NETMSGTYPE_SV_TILEDESTROY)
    {
        CNetMsg_Sv_TileDestroy *pMsg = (CNetMsg_Sv_TileDestroy *)pRawMsg;

        vec2 Pos = vec2(pMsg->m_X, pMsg->m_Y);
        if (Pos.x >= Layers()->MineTeeLayer()->m_Width-1 || Pos.x <= 0 || Pos.y >= Layers()->MineTeeLayer()->m_Height-1 || Pos.y <= 0)
            return;

        Layers()->DestroyTile(Pos);
        m_pClient->m_pEffects->BlockDestroy(vec2(Pos.x*32.0f, Pos.y*32.0f));
    }

When build...

void CCharacter::Construct()
{
    if(m_ReloadTimer != 0)
        return;

    bool Builded = false;
    int ActiveBlock = (m_ActiveWeapon - NUM_WEAPONS) % NUM_BLOCKS;

    DoWeaponSwitch();
    vec2 Direction = normalize(vec2(m_LatestInput.m_TargetX, m_LatestInput.m_TargetY));

    // check if we gonna fire
    bool WillFire = false;
    if(CountInput(m_LatestPrevInput.m_Fire, m_LatestInput.m_Fire).m_Presses)
        WillFire = true;

    if(!WillFire)
        return;

    vec2 ProjStartPos= m_Pos + Direction * 38.0f;
    vec2 colTilePos = ProjStartPos+Direction * 120.0f;
    CNetMsg_Sv_TileCreate TileInfo;

    if (m_pPlayer->m_PlayerFlags&PLAYERFLAG_BGPAINT)
    {
        CNetMsg_Sv_TileCreate TileInfo;
        TileInfo.m_X = static_cast<int>((m_Pos.x+m_LatestInput.m_TargetX)/32.0f);
        TileInfo.m_Y = static_cast<int>((m_Pos.y+m_LatestInput.m_TargetY)/32.0f);
        TileInfo.m_ITile = ActiveBlock;
        TileInfo.m_Col = true;
        TileInfo.m_State = (m_pPlayer->m_PlayerFlags&PLAYERFLAG_BGPAINT);

        Server()->SendPackMsg(&TileInfo, MSGFLAG_VITAL, -1);
        GameServer()->Collision()->CreateTile(vec2((m_Pos.x+m_LatestInput.m_TargetX), (m_Pos.y+m_LatestInput.m_TargetY)), ActiveBlock, 0, 1);
        GameServer()->CreateSound(m_Pos, SOUND_DESTROY_BLOCK);

        Builded = true;
    }
    else if (GameServer()->Collision()->IntersectLine(ProjStartPos, colTilePos, &colTilePos, 0x0, false))
    {

        vec2 finishPosPost = colTilePos-Direction * 16.0f;
        if (GameServer()->Collision()->GetCollisionAt(finishPosPost.x, finishPosPost.y) != CCollision::COLFLAG_SOLID)
        {
            CNetMsg_Sv_TileCreate TileInfo;
            TileInfo.m_X = static_cast<int>(finishPosPost.x/32.0f);
            TileInfo.m_Y = static_cast<int>(finishPosPost.y/32.0f);
            TileInfo.m_ITile = ActiveBlock;
            TileInfo.m_Col = true;
            TileInfo.m_State = (m_pPlayer->m_PlayerFlags&PLAYERFLAG_BGPAINT);

            //Check player stuck
            for (int i=0; i<MAX_CLIENTS; i++)
            {
                if (!GameServer()->m_apPlayers[i])
                    continue;

                CCharacter *pChar = GameServer()->m_apPlayers[i]->GetCharacter();
                if (!pChar || !pChar->IsAlive())
                    continue;

                if (vec2(static_cast<int>(pChar->m_Pos.x/32), static_cast<int>(pChar->m_Pos.y/32)) == vec2(TileInfo.m_X, TileInfo.m_Y))
                    return;
            }

            //check blocks
            unsigned char DenyBlocks[] = { BLOCK_LUZ };
            CTile *pMTTiles = (CTile *)GameServer()->Layers()->Map()->GetData(GameServer()->Layers()->MineTeeLayer()->m_Data);
            for (int i=0; i<sizeof(DenyBlocks); i++)
            {
                if (ActiveBlock != DenyBlocks[i])
                    continue;

                int Index = (TileInfo.m_Y-1)*GameServer()->Layers()->MineTeeLayer()->m_Width+TileInfo.m_X;
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
                Index = (TileInfo.m_Y+1)*GameServer()->Layers()->MineTeeLayer()->m_Width+TileInfo.m_X;
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
                Index = TileInfo.m_Y*GameServer()->Layers()->MineTeeLayer()->m_Width+(TileInfo.m_X-1);
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
                Index = TileInfo.m_Y*GameServer()->Layers()->MineTeeLayer()->m_Width+(TileInfo.m_X+1);
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
                Index = (TileInfo.m_Y-1)*GameServer()->Layers()->MineTeeLayer()->m_Width+(TileInfo.m_X-1);
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
                Index = (TileInfo.m_Y+1)*GameServer()->Layers()->MineTeeLayer()->m_Width+(TileInfo.m_X+1);
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
                Index = (TileInfo.m_Y+1)*GameServer()->Layers()->MineTeeLayer()->m_Width+(TileInfo.m_X-1);
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
                Index = (TileInfo.m_Y-1)*GameServer()->Layers()->MineTeeLayer()->m_Width+(TileInfo.m_X+1);
                if (pMTTiles[Index].m_Index == DenyBlocks[i])
                    return;
            }

            if (distance(m_Pos, finishPosPost) >= 42.0f)
            {
                Server()->SendPackMsg(&TileInfo, MSGFLAG_VITAL, -1);
                GameServer()->Collision()->CreateTile(finishPosPost, ActiveBlock, CCollision::COLFLAG_SOLID, 0);
                GameServer()->CreateSound(m_Pos, SOUND_DESTROY_BLOCK);

                Builded = true;
            }
        }
    }

    if (Builded)
    {
        m_aBlocks[ActiveBlock].m_Amount--;

        if(m_aBlocks[ActiveBlock].m_Amount == 0)
        {
            m_aBlocks[ActiveBlock].m_Got = false;

            ActiveBlock=1;
            while (!m_aBlocks[ActiveBlock].m_Got)
            {
                if (ActiveBlock >= NUM_BLOCKS)
                    break;

                ActiveBlock++;
            }

            if (ActiveBlock >= NUM_BLOCKS)
                SetWeapon(WEAPON_HAMMER);
            else
                SetWeapon(NUM_WEAPONS+ActiveBlock);
        }

        UpdateInventory();
    }
}

When Client get TILE_CREATE message...

    else if(MsgType == NETMSGTYPE_SV_TILECREATE)
    {
        CNetMsg_Sv_TileCreate *pMsg = (CNetMsg_Sv_TileCreate *)pRawMsg;

        vec2 Pos = vec2(pMsg->m_X, pMsg->m_Y);
        if (Pos.x >= Layers()->MineTeeLayer()->m_Width-1 || Pos.x <= 0 || Pos.y >= Layers()->MineTeeLayer()->m_Height-1 || Pos.y <= 0)
            return;

        Layers()->CreateTile(Pos, pMsg->m_ITile, pMsg->m_Col, pMsg->m_State);
    }


CreateTile Function "Collision.cpp":

void CCollision::CreateTile(vec2 Pos, int ITile, int Type, int State)
{
    if (!m_pLayers->MineTeeLayer())
        return;

    Pos = vec2(static_cast<int>(Pos.x/32.0f), static_cast<int>(Pos.y/32.0f));
    if (Pos.x >= m_pLayers->MineTeeLayer()->m_Width-1 || Pos.x <= 0 || Pos.y >= m_pLayers->MineTeeLayer()->m_Height-1 || Pos.y <= 0)
        return;

    //MineTee Layer
    if (State == 0)
    {
        int MTIndex = static_cast<int>(Pos.y*m_Width+Pos.x);
        CTile *pMTTiles = (CTile *)m_pLayers->Map()->GetData(m_pLayers->MineTeeLayer()->m_Data);
        pMTTiles[MTIndex].m_Flags = 0x0;
        pMTTiles[MTIndex].m_Index = ITile;
    }
    else
    {
        int MTIndex = static_cast<int>(Pos.y*m_Width+Pos.x);
        CTile *pMTBGTiles = (CTile *)m_pLayers->Map()->GetData(m_pLayers->MineTeeBGLayer()->m_Data);
        pMTBGTiles[MTIndex].m_Flags = 0x0;
        pMTBGTiles[MTIndex].m_Index = ITile;
    }

    //Game Layer
    int Index = Pos.y*m_pLayers->MineTeeLayer()->m_Width+Pos.x;
    m_pTiles[Index].m_Flags = 0x0;
    m_pTiles[Index].m_Index = Type;

    //Buffer it
    CNetMsg_Sv_TileChangeExt TileChange;
    TileChange.m_Act = TILE_CREATE;
    TileChange.m_X = static_cast<int>(Pos.x);
    TileChange.m_Y = static_cast<int>(Pos.y);
    TileChange.m_ITile = ITile;
    if (Type&CCollision::COLFLAG_SOLID)
        TileChange.m_Col = 1;
    else
        TileChange.m_Col = 0;

    TileChange.m_State = State;

    if (!CheckTileChangeBuffer(TileChange))
        m_pLayers->m_BuffNetTileChange.push_back(TileChange);
}

TileDestroy "Collision.cpp":

int CCollision::DestroyTile(vec2 Pos)
{
    int LIndex = -1;

    if (!m_pLayers->MineTeeLayer())
        return LIndex;

    Pos = vec2(static_cast<int>(Pos.x/32.0f), static_cast<int>(Pos.y/32.0f));
    if (Pos.x >= m_Width-1 || Pos.x <= 0 || Pos.y >= m_Height-1 || Pos.y <= 0)
        return LIndex;

    //MineTee Layer
    int MTIndex = static_cast<int>(Pos.y*m_pLayers->MineTeeLayer()->m_Width+Pos.x);
    CTile *pMTTiles = (CTile *)m_pLayers->Map()->GetData(m_pLayers->MineTeeLayer()->m_Data);
    LIndex = pMTTiles[MTIndex].m_Index;
    pMTTiles[MTIndex].m_Flags = 0x0;
    pMTTiles[MTIndex].m_Index = 0;

    //GameLayer
    int Index = static_cast<int>(Pos.y*m_Width+Pos.x);
    m_pTiles[Index].m_Flags = 0x0;
    m_pTiles[Index].m_Index = 0;

    //Buffer it
    CNetMsg_Sv_TileChangeExt TileChange;
    TileChange.m_Act = TILE_DESTROY;
    TileChange.m_X = static_cast<int>(Pos.x);
    TileChange.m_Y = static_cast<int>(Pos.y);
    TileChange.m_ITile = 0;
    TileChange.m_State = 0;

    if (!CheckTileChangeBuffer(TileChange))
        m_pLayers->m_BuffNetTileChange.push_back(TileChange);

    return LIndex;
}

CreateTile "layers.cpp":

void CLayers::CreateTile(vec2 Pos, int ITile, bool Coll, int State)
{
    if (!MineTeeLayer())
        return;

    CMapItemLayerTilemap *pTMap = 0x0;

    if (State)
        pTMap = MineTeeBGLayer();
    else
        pTMap = MineTeeLayer();

    if (pTMap)
    {
        CTile *pTiles = (CTile *)Map()->GetData(pTMap->m_Data);

        int Index = static_cast<int>(Pos.y*pTMap->m_Width+Pos.x);
        pTiles[Index].m_Flags = 0x0;
        pTiles[Index].m_Index = ITile;
    }

    //Game Layer
    if (Coll)
    {
        CMapItemLayerTilemap *pTMapGame = GameLayer();
        CTile *pTilesGame = (CTile *)Map()->GetData(pTMapGame->m_Data);

        int Index = static_cast<int>(Pos.y*pTMapGame->m_Width+Pos.x);
        pTilesGame[Index].m_Flags = 0x0;
        pTilesGame[Index].m_Index = (!State)?TILE_SOLID:0;
    }
}

DestroyTile "layers.cpp":

int CLayers::DestroyTile(vec2 Pos)
{
    int ITile = 0;
    CMapItemLayerTilemap *pTMap = MineTeeLayer();
    CTile *pTiles = (CTile *)Map()->GetData(pTMap->m_Data);

    int Index = static_cast<int>(Pos.y*pTMap->m_Width+Pos.x);

    ITile = pTiles[Index].m_Index;
    pTiles[Index].m_Flags = 0x0;
    pTiles[Index].m_Index = 0;

    //Game Layer
    CMapItemLayerTilemap *pTMapGame = GameLayer();
    CTile *pTilesGame = (CTile *)Map()->GetData(pTMapGame->m_Data);

    Index = static_cast<int>(Pos.y*pTMapGame->m_Width+Pos.x);
    pTilesGame[Index].m_Flags = 0x0;
    pTilesGame[Index].m_Index = 0;

    return ITile;
}

-----
And... in minetee layers i set m_Skip variable to 0 in all Tiles...

56

Re: [CLIENT] H-Client v4.0.3

uuuhhhmm... not simple, .... changes are always IN SENDING like a pickup ? (if near the tee client)
and othercode is to pass into "game core" what is changed ?

57

Re: [CLIENT] H-Client v4.0.3

The source looks nice, i guess i understood 70% of that. maybe less.. big_smile.
Hey uhm.. Can you finally release the whole thing of source code? :3.
I don't want to hack it as CarmineZ said. I just wanted to make it more.. My-Style-Sided big_smile.
You know?
Would give 99% credits to you when i modified it and released my version.

58

Re: [CLIENT] H-Client v4.0.3

@CarmineZ: When one player destroy or create a block, the server send the message to all clients and save this action in "m_NetBuffTileChange" array... When one user enter in the game, the server send all data saved in the array to the new user..

@powachill4: Thx! Perhaps you don't like hack the client.. but other users..... emmmmmmm :\

-----------

Sry for my bad english :S

59

Re: [CLIENT] H-Client v4.0.3

When minetee wil be release?

60 (edited by powachill4 2012-03-05 14:52:27)

Re: [CLIENT] H-Client v4.0.3

@I dont know, possibly we can chat a bit in skype? [ill send you a pm right now] and maybe we can make a compromise..^^


#edit
@unnamedkz_pro:
its not officially released but you was able to play it (actually i cant connect to the server D:)

61 (edited by 2012-03-05 17:03:00)

Re: [CLIENT] H-Client v4.0.3

And... in minetee layers i set m_Skip variable to 0 in all Tiles...

why need 0 value? and where you set/forced it to 0?

seems a good job, but i can't test your game, your server is down..., maybe i will patch your code into the official source, so i will can test crafting [(or ingame map editing - {or how it is called} XD)] by myself...

i think that it is the best feature for the future of teeworlds.... and also if official develpment will not go in this direction, your mod will survive

I do not know wrote:

@CarmineZ: When one player destroy or create a block, the server send the message to all clients and save this action in "m_NetBuffTileChange" array... When one user enter in the game, the server send all data saved in the array to the new user..

so can i have only the part of code to make possible it? (i want to create a gametype different from minecraft, but your map-ingame-changeable system is very interesting, and i haven't time to rework a thing that you have already solved...) 
your work can save many hour of my time...
if you need, in my site you can find a beta try of a mod, with slopes and many weapons and little things, if are usefull you can use...

62

Re: [CLIENT] H-Client v4.0.3

CarmineZ: This part of code is very very very very veeeeeeeryyyyyy ugly... i need rewrite how sync map works... but i share it smile

First i need a message to send all changes of the map:

    NetMessage("Sv_TileChangeExt", [
        NetIntAny("m_Index"),
        NetIntAny("m_X"),
        NetIntAny("m_Y"),
        NetIntAny("m_ITile"),
        NetIntAny("m_State"),
        NetIntAny("m_Col"),
        NetIntRange("m_Act", 'TILE_DESTROY', 'TILE_CREATE'),
    ]),
    NetMessage("Sv_TileChange_Info", [
        NetIntAny("m_Size"),
    ]),
    NetMessage("Cl_TileChangeRequest", [
        NetIntAny("m_Index"),
    ]),

When one player join in to party the server send the size of the array:

    //H-Client: send Map State
    if (str_comp_nocase(GameType(), "MineTee") == 0)
    {
        int Size = Layers()->m_BuffNetTileChange.size();

        if (Size > 0)
        {
            CNetMsg_Sv_TileChange_Info TInfo;
            TInfo.m_Size = Size;
            Server()->SendPackMsg(&TInfo, MSGFLAG_VITAL, ClientID);
        }
    }

When client get the TILECHANGE_INFO message send a request to server:

    else if(MsgId == NETMSGTYPE_SV_TILECHANGE_INFO)
    {
        int MapStateSize = pUnpacker->GetInt();

        if(pUnpacker->Error() || MapStateSize < 0)
            return;

        else
        {
            m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "starting to download map state");
            Client()->SetSyncTotalSize(MapStateSize);  //TODO: Ugly

            CMsgPacker Msg(NETMSGTYPE_CL_TILECHANGEREQUEST);
            Msg.AddInt(0);
            Client()->SendMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH);

            if(g_Config.m_Debug)
                m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client/network", "requested chunk");
        }

        return;
    }

When the server get CL_TILECHANGEREQUEST message send to client the data:

    else if(MsgID == NETMSGTYPE_CL_TILECHANGEREQUEST)
    {
        CNetMsg_Cl_TileChangeRequest *pMsg = (CNetMsg_Cl_TileChangeRequest *)pRawMsg;
        int CIndex = pMsg->m_Index;

        // drop faulty map data requests

        if(CIndex < 0 || CIndex >= Layers()->m_BuffNetTileChange.size())
            return;

        for (int o=0; o<TILECHANGE_MAX_PACKS; o++)
        {
            if (CIndex+o >= Layers()->m_BuffNetTileChange.size())
                break;

            CNetMsg_Sv_TileChangeExt *pTileChange = static_cast<CNetMsg_Sv_TileChangeExt*>(&Layers()->m_BuffNetTileChange[CIndex+o]);
            if (!pTileChange)
                return;
            CMsgPacker Msg(NETMSGTYPE_SV_TILECHANGEEXT);
            Msg.AddInt(CIndex+o);
            Msg.AddInt(pTileChange->m_X);
            Msg.AddInt(pTileChange->m_Y);
            Msg.AddInt(pTileChange->m_ITile);
            Msg.AddInt(pTileChange->m_State);
            Msg.AddInt(pTileChange->m_Col);
            Msg.AddInt(pTileChange->m_Act);
            Server()->SendMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID);
        }

        if(g_Config.m_Debug)
            Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "server", "sending chunk map state...");
    }

*** You can see that i send ALL info... (I know that this is veeeeeeeryyyyyyyyyyy shit!) REWORK REWORK REWORK!!!

When the client get the data...

    else if(MsgId == NETMSGTYPE_SV_TILECHANGEEXT)
    {
        int Index = pUnpacker->GetInt();
        int posX = pUnpacker->GetInt();
        int posY = pUnpacker->GetInt();
        int ITile = pUnpacker->GetInt();
        int State = pUnpacker->GetInt();
        int Coll = pUnpacker->GetInt();
        int Act = pUnpacker->GetInt();

        // check fior errors
        if(pUnpacker->Error() || Index < 0  || Index >= Client()->MapSyncTotalsize())
            return;

        if (Act == TILE_DESTROY)
            Layers()->DestroyTile(vec2(posX, posY));
        else if (Act == TILE_CREATE)
            Layers()->CreateTile(vec2(posX, posY), ITile, Coll, State);

        if(Index+1 >= Client()->MapSyncTotalsize())
        {
            const char *pError;
            m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "download complete, loading map");

            Client()->SetSyncAmount(0); //TODO: Ugly
            Client()->SetSyncTotalSize(-1); //TODO: Ugly

            return;
        }
        else if (Index%TILECHANGE_MAX_PACKS == 0)
        {
            CMsgPacker Msg(NETMSGTYPE_CL_TILECHANGEREQUEST);
            Msg.AddInt(Index+1);
            m_pClient->SendMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH);

            if(g_Config.m_Debug)
                m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client/network", "requested chunk");
        }

        Client()->SetSyncAmount(Index+1); //TODO: Ugly

        return;
    }

-------------

I need set m_Skip to 0 to render all tiles.

63

Re: [CLIENT] H-Client v4.0.3

I dl that H-client but cant connect -.- whats wrong?

C++/Java my life ^^
If you like dislike button click it
NOW!

64

Re: [CLIENT] H-Client v4.0.3

"I do not Know" i want help you, like you said, re-send all data (of the "array" i think) is not definitive way...
... you must create an EVENT/type to apply each single tile when change state....
... i haven't read all code... why you don't put a your feature in a ".patch" file, so for me would more simple to find where write your code

65

Re: [CLIENT] H-Client v4.0.3

Extremly nice Client! Its even cool on any mod! ^^
Couldnt connect to server yet, but awesome work bro!
[+]

66

Re: [CLIENT] H-Client v4.0.3

@CarmineZ: This weekend i send you a mp to talk about the source smile thx!

@KittyPL: The server is down because I want people to have a good gaming experience ..

@SkyHawk: Thx wink

67

Re: [CLIENT] H-Client v4.0.3

@i dont know, finally i sent you pm with my skype addy and.. yes you should use an event for this (isnt it an event when a tile changes?)
And.. im wondering why some people doesnt react to this topic D: this is soo a good mod even when i played it only once.

68

Re: [CLIENT] H-Client v4.0.3

@powachill4: The problem of skype its my bad english... xDD

And... the people hate me and don't like teeworlds changes with this paraphernalia smile
I need enter to forum via proxy xDD

69

Re: [CLIENT] H-Client v4.0.3

this "paraphernalia" [ LoL ] is a very good thing for a better {tee}world{s}  !!
because with this feature CLIENT will can predict more things, this will enlarge range of creation of different possible gametypes.... etc big_smile

70

Re: [CLIENT] H-Client v4.0.3

Lol.

[...] will can [...]


@I Dont Know, are you german? If so, i am :d
@Other homies, why you disliked my post before?! -.-'
@CarmineZ, i like your avatar, cant throw my eyes away from it LOL big_smile

71 (edited by andi103 2012-03-07 20:49:03)

Re: [CLIENT] H-Client v4.0.3

@powachill4
The site in his signature isn't german. (http://clanhdp.org/)
Why do you think he is  german?

72

Re: [CLIENT] H-Client v4.0.3

@powachill4 made a selfkill with his last post.

C++/Java my life ^^
If you like dislike button click it
NOW!

73

Re: [CLIENT] H-Client v4.0.3

Great job, HDP tongue
I like the mod, I like the way you invent MineCraft features into 2d game.

Are there any testservers online 24/7?
I'd like to play it myself, not only watch youtube..

74

Re: [CLIENT] H-Client v4.0.3

Lol look at my karma, it goes abysal down x'D.

Source finally released?

75 (edited by unsigned char* 2012-03-11 07:23:42)

Re: [CLIENT] H-Client v4.0.3

New version released:

Ok, you can test minetee server with H-Client v2.4 (its beta version):
http://bit.ly/zvlhzA

COMMANDS:

 - bgpaint : Toggle background paint mode.
 - drop : Drop current item of inventory.

Recommended Binds

bind e bgpaint
bind g drop

TESTING SERVER: 91.121.168.215:8303

** pls report any issue thx!

ENJOY!