Tab completion packet is handled and sent.
This only handles the network comm and the overall design logic, the actual completion is not yet implemented, only dummy values are returned for now.
This commit is contained in:
parent
9efcd5b82f
commit
e9f18f8b4f
@ -1235,6 +1235,23 @@ void cClientHandle::HandleUnmount(void)
|
||||
|
||||
|
||||
|
||||
void cClientHandle::HandleTabCompletion(const AString & a_Text)
|
||||
{
|
||||
AStringVector Results;
|
||||
m_Player->GetWorld()->TabCompleteUserName(a_Text, Results);
|
||||
cRoot::Get()->GetPluginManager()->TabCompleteCommand(a_Text, Results);
|
||||
if (Results.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
std::sort(Results.begin(), Results.end());
|
||||
SendTabCompletionResults(Results);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cClientHandle::SendData(const char * a_Data, int a_Size)
|
||||
{
|
||||
{
|
||||
@ -1781,6 +1798,15 @@ void cClientHandle::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleTy
|
||||
|
||||
|
||||
|
||||
void cClientHandle::SendTabCompletionResults(const AStringVector & a_Results)
|
||||
{
|
||||
m_Protocol->SendTabCompletionResults(a_Results);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cClientHandle::SendTeleportEntity(const cEntity & a_Entity)
|
||||
{
|
||||
m_Protocol->SendTeleportEntity(a_Entity);
|
||||
|
@ -121,11 +121,12 @@ public:
|
||||
void SendPlayerSpawn (const cPlayer & a_Player);
|
||||
void SendRespawn (void);
|
||||
void SendSoundEffect (const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch); // a_Src coords are Block * 8
|
||||
void SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data);
|
||||
void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data);
|
||||
void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock);
|
||||
void SendSpawnMob (const cMonster & a_Mob);
|
||||
void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch);
|
||||
void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType);
|
||||
void SendTabCompletionResults(const AStringVector & a_Results);
|
||||
void SendTeleportEntity (const cEntity & a_Entity);
|
||||
void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay);
|
||||
@ -184,6 +185,7 @@ public:
|
||||
bool HandleHandshake (const AString & a_Username);
|
||||
void HandleEntityAction (int a_EntityID, char a_ActionID);
|
||||
void HandleUnmount (void);
|
||||
void HandleTabCompletion (const AString & a_Text);
|
||||
|
||||
/** Called when the protocol has finished logging the user in.
|
||||
Return true to allow the user in; false to kick them.
|
||||
|
@ -1335,6 +1335,20 @@ bool cPluginManager::ExecuteConsoleCommand(const AStringVector & a_Split, cComma
|
||||
|
||||
|
||||
|
||||
void cPluginManager::TabCompleteCommand(const AString & a_Text, AStringVector & a_Results)
|
||||
{
|
||||
// TODO
|
||||
// DEBUG:
|
||||
LOGWARNING("%s: Not implemented yet!", __FUNCTION__);
|
||||
a_Results.push_back(a_Text + "_plgmgr1");
|
||||
a_Results.push_back(a_Text + "_plgmgr3");
|
||||
a_Results.push_back(a_Text + "_plgmgr2");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool cPluginManager::AddPlugin(cPlugin * a_Plugin)
|
||||
{
|
||||
m_Plugins[a_Plugin->GetDirectory()] = a_Plugin;
|
||||
|
@ -197,6 +197,9 @@ public: // tolua_export
|
||||
/// Executes the command split into a_Split, as if it was given on the console. Returns true if executed. Output is sent to the a_Output callback
|
||||
bool ExecuteConsoleCommand(const AStringVector & a_Split, cCommandOutputCallback & a_Output);
|
||||
|
||||
/// Appends all commands beginning with a_Text (case-insensitive) into a_Results
|
||||
void TabCompleteCommand(const AString & a_Text, AStringVector & a_Results);
|
||||
|
||||
private:
|
||||
friend class cRoot;
|
||||
|
||||
|
@ -86,11 +86,12 @@ public:
|
||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) = 0;
|
||||
virtual void SendRespawn (void) = 0;
|
||||
virtual void SendSoundEffect (const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) = 0; // a_Src coords are Block * 8
|
||||
virtual void SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) = 0;
|
||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) = 0;
|
||||
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) = 0;
|
||||
virtual void SendSpawnMob (const cMonster & a_Mob) = 0;
|
||||
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) = 0;
|
||||
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType) = 0;
|
||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) = 0;
|
||||
virtual void SendTeleportEntity (const cEntity & a_Entity) = 0;
|
||||
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) = 0;
|
||||
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay) = 0;
|
||||
|
@ -782,6 +782,16 @@ void cProtocol125::SendSpawnVehicle(const cEntity & a_Vehicle, char a_VehicleTyp
|
||||
|
||||
|
||||
|
||||
void cProtocol125::SendTabCompletionResults(const AStringVector & a_Results)
|
||||
{
|
||||
// This protocol version doesn't support tab completion
|
||||
UNUSED(a_Results);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cProtocol125::SendTeleportEntity(const cEntity & a_Entity)
|
||||
{
|
||||
cCSLock Lock(m_CSPacket);
|
||||
|
@ -63,11 +63,12 @@ public:
|
||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
||||
virtual void SendRespawn (void) override;
|
||||
virtual void SendSoundEffect (const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) override; // a_Src coords are Block * 8
|
||||
virtual void SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
||||
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
||||
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
||||
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType) override;
|
||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) override;
|
||||
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
||||
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay) override;
|
||||
|
@ -70,6 +70,7 @@ enum
|
||||
PACKET_BLOCK_BREAK_ANIM = 0x37,
|
||||
PACKET_SOUND_EFFECT = 0x3e,
|
||||
PACKET_SOUND_PARTICLE_EFFECT = 0x3d,
|
||||
PACKET_TAB_COMPLETION = 0xcb,
|
||||
PACKET_LOCALE_VIEW_DISTANCE = 0xcc,
|
||||
PACKET_CLIENT_STATUSES = 0xcd,
|
||||
PACKET_ENCRYPTION_KEY_RESP = 0xfc,
|
||||
@ -426,6 +427,31 @@ void cProtocol132::SendSpawnMob(const cMonster & a_Mob)
|
||||
|
||||
|
||||
|
||||
void cProtocol132::SendTabCompletionResults(const AStringVector & a_Results)
|
||||
{
|
||||
if (a_Results.empty())
|
||||
{
|
||||
// No results to send
|
||||
return;
|
||||
}
|
||||
|
||||
AString Serialized(a_Results[0]);
|
||||
for (AStringVector::const_iterator itr = a_Results.begin() + 1, end = a_Results.end(); itr != end; ++itr)
|
||||
{
|
||||
Serialized.push_back(0);
|
||||
Serialized.append(*itr);
|
||||
} // for itr - a_Results[]
|
||||
|
||||
cCSLock Lock(m_CSPacket);
|
||||
WriteByte(PACKET_TAB_COMPLETION);
|
||||
WriteString(Serialized);
|
||||
Flush();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cProtocol132::SendUnloadChunk(int a_ChunkX, int a_ChunkZ)
|
||||
{
|
||||
// Not used in 1.3.2
|
||||
@ -484,9 +510,10 @@ int cProtocol132::ParsePacket(unsigned char a_PacketType)
|
||||
switch (a_PacketType)
|
||||
{
|
||||
default: return super::ParsePacket(a_PacketType); // off-load previously known packets into cProtocol125
|
||||
case PACKET_LOCALE_VIEW_DISTANCE: return ParseLocaleViewDistance();
|
||||
case PACKET_CLIENT_STATUSES: return ParseClientStatuses();
|
||||
case PACKET_ENCRYPTION_KEY_RESP: return ParseEncryptionKeyResponse();
|
||||
case PACKET_LOCALE_VIEW_DISTANCE: return ParseLocaleViewDistance();
|
||||
case PACKET_TAB_COMPLETION: return ParseTabCompletion();
|
||||
}
|
||||
}
|
||||
|
||||
@ -632,6 +659,17 @@ int cProtocol132::ParsePlayerAbilities(void)
|
||||
|
||||
|
||||
|
||||
int cProtocol132::ParseTabCompletion(void)
|
||||
{
|
||||
HANDLE_PACKET_READ(ReadBEUTF16String16, AString, Text);
|
||||
m_Client->HandleTabCompletion(Text);
|
||||
return PARSE_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cProtocol132::SendData(const char * a_Data, int a_Size)
|
||||
{
|
||||
m_DataToSend.append(a_Data, a_Size);
|
||||
|
@ -40,8 +40,9 @@ public:
|
||||
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
||||
virtual void SendSoundEffect (const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) override; // a_Src coords are Block * 8
|
||||
virtual void SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) override;
|
||||
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
||||
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
||||
|
||||
@ -60,6 +61,7 @@ public:
|
||||
virtual int ParseClientStatuses (void);
|
||||
virtual int ParseEncryptionKeyResponse(void);
|
||||
virtual int ParseLocaleViewDistance (void);
|
||||
virtual int ParseTabCompletion (void);
|
||||
|
||||
protected:
|
||||
bool m_IsEncrypted;
|
||||
|
@ -511,6 +511,16 @@ void cProtocolRecognizer::SendSpawnVehicle(const cEntity & a_Vehicle, char a_Veh
|
||||
|
||||
|
||||
|
||||
void cProtocolRecognizer::SendTabCompletionResults(const AStringVector & a_Results)
|
||||
{
|
||||
ASSERT(m_Protocol != NULL);
|
||||
m_Protocol->SendTabCompletionResults(a_Results);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cProtocolRecognizer::SendTeleportEntity(const cEntity & a_Entity)
|
||||
{
|
||||
ASSERT(m_Protocol != NULL);
|
||||
|
@ -93,11 +93,12 @@ public:
|
||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
||||
virtual void SendRespawn (void) override;
|
||||
virtual void SendSoundEffect (const AString & a_SoundName, int a_SrcX, int a_SrcY, int a_SrcZ, float a_Volume, float a_Pitch) override;
|
||||
virtual void SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
||||
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
||||
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
||||
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType) override;
|
||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) override;
|
||||
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
||||
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay) override;
|
||||
|
@ -2364,6 +2364,20 @@ int cWorld::SpawnMob(double a_PosX, double a_PosY, double a_PosZ, int a_EntityTy
|
||||
|
||||
|
||||
|
||||
void cWorld::TabCompleteUserName(const AString & a_Text, AStringVector & a_Results)
|
||||
{
|
||||
// TODO
|
||||
// DEBUG:
|
||||
LOGWARNING("%s: Not implemented yet!", __FUNCTION__);
|
||||
a_Results.push_back(a_Text + "_world1");
|
||||
a_Results.push_back(a_Text + "_world3");
|
||||
a_Results.push_back(a_Text + "_world2");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cFluidSimulator * cWorld::InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock)
|
||||
{
|
||||
AString SimulatorNameKey;
|
||||
|
@ -519,6 +519,9 @@ public:
|
||||
/// Returns a random number from the m_TickRand in range [0 .. a_Range]. To be used only in the tick thread!
|
||||
int GetTickRandomNumber(unsigned a_Range) { return (int)(m_TickRand.randInt(a_Range)); }
|
||||
|
||||
/// Appends all usernames starting with a_Text (case-insensitive) into Results
|
||||
void TabCompleteUserName(const AString & a_Text, AStringVector & a_Results);
|
||||
|
||||
private:
|
||||
|
||||
friend class cRoot;
|
||||
|
Loading…
Reference in New Issue
Block a user