Author Topic: Player has no datablock?  (Read 1745 times)

I'm making a gamemode that uses the function Player::addItem.
Code: [Select]
function Player::addItem(%player,%image,%client)
{
   for(%i = 0; %i < %player.getDatablock().maxTools; %i++)
   {
      %tool = %player.tool[%i];
      if(%tool == 0)
      {
         %player.tool[%i] = %image;
         %player.weaponCount++;
         messageClient(%client,'MsgItemPickup','',%i,%image);
         break;
      }
   }
}

Upon trying to call this function, I get this an error in the console:
Quote
Unable to find object: '' attempting to call function 'getDataBlock'

I decided to see if the player has a datablock by using:
Quote
echo(findclientbyname(czar).player.getdatablock);
and it outputs nothing.

I have the player datablock defined in gamemode.txt.
Quote
$MiniGame::PlayerDataBlockName No-Jet Player

Anybody know how to fix this?

The second quote doesn't work because you forgot (). The actual error is most likely not caused in this function. Post the code that calls it.

Code: [Select]
function randomItem2(%client)
{
  %r = getRandom (1, 3);

  switch(%r)
  {
    case 1:
      Player::addItem(%client.player, nameToId("ShotgunItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 2:
      Player::addItem(%client.player, nameToId("RifleItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 3:
      Player::addItem(%client.player, nameToId("SniperItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);
  }
}

is the client spawned, aka has a player object? use isObject(%client.player) to see if the %client is spawned

So how are you calling that function? Post the whole code, not small segments.

So how are you calling that function? Post the whole code, not small segments.

Code: [Select]
package BunkerBattle
{
  function MiniGameSO::checkLastManStanding(%this, %client)
  {

  BrickGroup_888888.chaindeleteall();
    schedule(1000, 0, randomMap);

    Parent::checkLastManStanding(%this, %client);
  }

  function MinigameSO::Reset(%obj, %client)
  {
    beginBuildMode();

    Parent::Reset(%obj, %client);
  }
};

activatePackage("BunkerBattle");

function beginBuildMode()
{
  $BuildMode = 1;

  $DefaultMinigame.fallingDamage = false;
$DefaultMiniGame.weaponDamage = false;
$DefaultMiniGame.setEnableBuilding(true);

  messageAll('MsgAdminForce', "\c6Build mode is now beginning! You have 3 minutes to build!");

  schedule(60000, 0, messageAll,'MsgAdminForce', "\c6You have 2 minutes left!");
  schedule(120000, 0, messageAll,'MsgAdminForce', "\c6You have 1 minutes left!");
  schedule(150000, 0, messageAll,'MsgAdminForce', "\c6You have 30 seconds left!");
  schedule(165000, 0, messageAll,'MsgAdminForce', "\c6You have 15 seconds left!");
  schedule(180000, 0, messageAll,'MsgAdminForce', "\c6Battle Mode is now beginning!");
  schedule(180000, 0, beginBattleMode);

  $BuildMode = 0;
}

function beginBattleMode()
{
  $BattleMode = 1;

  $DefaultMinigame.fallingDamage = true;
$DefaultMiniGame.weaponDamage = true;
  $DefaultMiniGame.setEnableBuilding(false);

  for(%i=0;%i<ClientGroup.getCount();%i++)
  {
  %targetclient = ClientGroup.getObject(%i);
  if(isObject(%targetclient.minigame))
   {
        %client = %targetclient;
    randomItem(%client);
   }
   }
}

function randomMap()
{
  %v = getRandom(1, 1);

  switch(%v)
  {
    case 1:
      serverDirectSaveFileLoad("Add-Ons/Gamemode_Bunker_Battle/save.bls", 3, "", 2);
  }
}

function Player::addItem(%player,%image,%client)
{
   for(%i = 0; %i < %player.getDatablock().maxTools; %i++)
   {
      %tool = %player.tool[%i];
      if(%tool == 0)
      {
         %player.tool[%i] = %image;
         %player.weaponCount++;
         messageClient(%client,'MsgItemPickup','',%i,%image);
         break;
      }
   }
}

function randomItem(%client)
{
  if(isObject(%client.minigame))
  {
    for(%i = 0; %i < %client.minigame.numMembers; %i++)
    {
      %targetclient = %client.minigame.member[%i];
      Player::ClearTools(%targetclient.player);
    }
  }

  schedule(100, 0, "randomItem2");
}

function randomItem2(%client)
{
  %r = getRandom (1, 3);

  switch(%r)
  {
    case 1:
      Player::addItem(%client.player, nameToId("ShotgunItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 2:
      Player::addItem(%client.player, nameToId("RifleItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 3:
      Player::addItem(%client.player, nameToId("SniperItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);
  }
}

//extra stuff
brick16x16fData.uiName = "";
brick16x32fData.uiName = "";
brick32x32fData.uiName = "";
brick48x48fData.uiName = "";
brick64x64fData.uiName = "";

brick32x32froadxData.uiName = "";
brick32x32froadcData.uiName = "";
brick32x32froadtData.uiName = "";
brick32x32froadsData.uiName = "";

hammerProjectile.directDamage = 0;

is the client spawned, aka has a player object? use isObject(%client.player) to see if the %client is spawned
Yes, it is.

Use this to add items, it's a little smarter but not by much as it can create mistakes.
You can include item names and IDs which it will fix that for you.

https://www.dropbox.com/s/uiwexzwx6oia5rg/Support_FindItemByName.cs?dl=0

Here are examples:
%player.addNewItem(%player, GunItem);
%player.addNewItem(%player, nameToID("GunItem"));
%player.addNewItem(%player, "Gun");



Code: [Select]
Code: [Select]
function randomItem2(%client)
{
  %r = getRandom (1, 3);

  switch(%r)
  {
    case 1:
      Player::addItem(%client.player, nameToId("ShotgunItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 2:
      Player::addItem(%client.player, nameToId("RifleItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 3:
      Player::addItem(%client.player, nameToId("SniperItem"), %client);
      Player::addItem(%client.player, nameToId("PistolItem"), %client);
  }
}

This code can be turned into:
Code: [Select]
function GameConnection::randomItem2(%client)
{
//get the player from the client
%player = %client.player;
if(!isObject(%player))
return;

%r = getRandom(1, 3);

//if player does exist, it's already knownto be Player::, so we just call the function on the object.
switch(%r)
{
    case 1:
    %player.addItem(nameToID("ShotgunItem"));
//Player::addItem(%client.player, nameToId("ShotgunItem"), %client);

%player.addItem(nameToID("PistolItem"));
//Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 2:
    %player.addItem(nameToID("RifleItem"));
//Player::addItem(%client.player, nameToId("RifleItem"), %client);

%player.addItem(nameToID("PistolItem"));
//Player::addItem(%client.player, nameToId("PistolItem"), %client);

    case 3:
    %player.addItem(nameToID("SniperItem"));
//Player::addItem(%client.player, nameToId("SniperItem"), %client);

%player.addItem(nameToID("PistolItem"));
//Player::addItem(%client.player, nameToId("PistolItem"), %client);
}
}

In your code why are you doing Player::blah(%object) and not %object.blah() ?

schedule(100, 0, "randomItem2");

This calls randomItem2 without any arguments. You need:

schedule(100, 0, "randomItem2", %client);



Btw, you can call member functions like this:

%client.player.addItem(ShotgunItem.getId(), %client);

vis, he's not using %object.blah since his function name is Player::addItem()

probably doesn't know he can define member functions. i don't know how to do that either actually

probably doesn't know he can define member functions. i don't know how to do that either actually

Exactly the way he's doing it now. function Player::addItem is correct.


Exactly the way he's doing it now. function Player::addItem is correct.
...derp. somewhat incongruous with the servercmd/clientcmd[function] setup, but at least this one makes more sense.

vis, he's not using %object.blah since his function name is Player::addItem()

probably doesn't know he can define member functions. i don't know how to do that either actually
Uh, calling functions on objects like %player.kill(); is just like Player::kill(%player);

Defining a function with :: makes it a namespace

Uh, calling functions on objects like %player.kill(); is just like Player::kill(%player);

Defining a function with :: makes it a namespace
It's actually not the same for engine methods. FxDtsBrick::getNumUpBricks(%brick); will crash the game.