in Minecraft/src/main/java/com/microsoft/Malmo/Client/ClientStateMachine.java [2002:2091]
private void sendData()
{
TCPUtils.LogSection ls = new TCPUtils.LogSection("Sending data");
Minecraft.getMinecraft().mcProfiler.endStartSection("malmoSendData");
// Create the observation data:
String data = "";
Minecraft.getMinecraft().mcProfiler.startSection("malmoGatherObservationJSON");
if (currentMissionBehaviour() != null && currentMissionBehaviour().observationProducer != null)
{
JsonObject json = new JsonObject();
currentMissionBehaviour().observationProducer.writeObservationsToJSON(json, currentMissionInit());
data = json.toString();
}
Minecraft.getMinecraft().mcProfiler.endStartSection("malmoSendTCPObservations");
ClientAgentConnection cac = currentMissionInit().getClientAgentConnection();
if (data != null && data.length() > 2 && cac != null) // An empty json string will be "{}" (length 2) - don't send these.
{
if (AddressHelper.getMissionControlPort() == 0) {
if (envServer != null) {
envServer.observation(data);
}
} else {
// Bung the whole shebang off via TCP:
if (this.observationSocket.sendTCPString(data)) {
this.failedTCPObservationSendCount = 0;
} else {
// Failed to send observation message.
this.failedTCPObservationSendCount++;
TCPUtils.Log(Level.WARNING, "Observation signal delivery failure count at " + this.failedTCPObservationSendCount);
ClientStateMachine.this.getScreenHelper().addFragment("ERROR: Agent missed observation signal", TextCategory.TXT_CLIENT_WARNING, 5000);
}
}
}
Minecraft.getMinecraft().mcProfiler.endStartSection("malmoGatherRewardSignal");
// Now create the reward signal:
if (currentMissionBehaviour() != null && currentMissionBehaviour().rewardProducer != null && cac != null)
{
MultidimensionalReward reward = new MultidimensionalReward();
currentMissionBehaviour().rewardProducer.getReward(currentMissionInit(), reward);
if (!reward.isEmpty())
{
String strReward = reward.getAsSimpleString();
Minecraft.getMinecraft().mcProfiler.startSection("malmoSendTCPReward");
ScoreHelper.logReward(strReward);
if (AddressHelper.getMissionControlPort() == 0) {
// MalmoEnvServer - reward
if (envServer != null) {
envServer.addRewards(reward.getRewardTotal());
}
} else {
if (this.rewardSocket.sendTCPString(strReward)) {
this.failedTCPRewardSendCount = 0; // Reset the count of consecutive TCP failures.
} else {
// Failed to send TCP message - probably because the agent has quit under our feet.
// (This happens a lot when developing a Python agent - the developer has no easy way to quit
// the agent cleanly, so tends to kill the process.)
this.failedTCPRewardSendCount++;
TCPUtils.Log(Level.WARNING, "Reward signal delivery failure count at " + this.failedTCPRewardSendCount);
ClientStateMachine.this.getScreenHelper().addFragment("ERROR: Agent missed reward signal", TextCategory.TXT_CLIENT_WARNING, 5000);
}
}
}
}
Minecraft.getMinecraft().mcProfiler.endSection();
int maxFailedTCPSendCount = 0;
for (VideoHook hook : this.videoHooks)
{
if (hook.failedTCPSendCount > maxFailedTCPSendCount)
maxFailedTCPSendCount = hook.failedTCPSendCount;
}
if (maxFailedTCPSendCount > 0)
TCPUtils.Log(Level.WARNING, "Video signal failure count at " + maxFailedTCPSendCount);
// Check that our messages are getting through:
int maxFailed = Math.max(this.failedTCPRewardSendCount, maxFailedTCPSendCount);
maxFailed = Math.max(maxFailed, this.failedTCPObservationSendCount);
if (maxFailed > FailedTCPSendCountTolerance)
{
// They're not - and we've exceeded the count of allowed TCP failures.
System.out.println("ERROR: TCP messages are not getting through - quitting mission.");
this.wantsToQuit = true;
this.quitCode = MalmoMod.AGENT_UNRESPONSIVE_CODE;
}
ls.close();
}