anchor.diff:      begin
         NetplayersIndex := fNetworking.NetPlayers.PlayerIndexToLocal(I);
         // In the case where a player was removed from a save, NetplayersIndex = -1
  -      if (NetplayersIndex <> -1) and not fNetworking.NetPlayers[NetplayersIndex].Dropped then
  +      if (NetplayersIndex <> -1) and not fNetworking.NetPlayers[NetplayersIndex].Dropped
  +      //Don't allow exploits like moving enemy soldiers
  +      and CheckCommandPermission(I, fSchedule[Tick, I].Items[K]) then
         begin
           StoreCommand(fSchedule[Tick, I].Items[K]); //Store the command first so if Exec fails we still have it in the replay
           ExecCommand(fSchedule[Tick, I].Items[K]);
  
positive.code: 
      procedure SetDelay(aNewDelay:integer);
      procedure AdjustDelay;
    protected
      procedure TakeCommand(aCommand:TGameInputCommand); override;
    public
  
negative.code:   //for processing the packet and random variations in ping. It's always better for commands to
    //be slightly delayed than for the game to freeze/lag regularly.
    SetDelay( Ceil(fNetworking.NetPlayers.GetMaxHighestRoundTripLatency/200 + 1.2) );
  end;
  
  
  //Does Player1 have permission to execute CommandType on Player2's behalf?
  function TGameInputProcess_Multi.CheckCommandPermission(Player: TPlayerIndex; const aCommand: TGameInputCommand): Boolean;
  begin
    //For now players may only control themselves. Eventually that might change (for certain commands only?)
    Result := (Player = aCommand.PlayerIndex);
  end;
  
  
  