Jump to content

Question

Posted (edited)

I have this code in doDie method inside L2MonsterInstance.java file:

		int npcId = getTemplate().getId();
		switch (npcId)
		{
			case 150:
				if (((L2PcInstance) killer).getClan() == null)
				{
					return false;
				}
				if (killer.getActingPlayer() != null)
				{
					((L2PcInstance) killer).getClan().addReputationScore(10, true); // Change 1 with the reputation points you want to add upon kill monster
					((L2PcInstance) killer).sendMessage("Your Clan Reputation is increased by 10.");
				}
				final L2Summon summon = killer.getSummon();
				if (summon.getOwner() != null)
				{
					return false;
				}
				
		}

However, when i am killing monster with ID 150 i am getting a NullPointerException. Instead if the monster is killed by a summon or a pet i am getting a  ClassCasterException.
How to solve it?

Edited by Gries

10 answers to this question

Recommended Posts

  • 0
Posted (edited)
		int npcId = getTemplate().getId();
		switch (npcId)
		{
			case 150:
				final L2PcInstance player = killer.getActingPlayer();
				if (player != null)
				{
					final L2Clan clan = player.getClan();
					
					if (clan != null)
					{
						clan.addReputationScore(10, true); // Change 10 with the reputation points you want to add upon kill monster
					}
					final L2Summon summon = killer.getSummon();
					if (summon != null)
					{
						return false;
					}
					
					player.sendMessage("Your Clan Reputation is increased by 10.");
				}

Changed code like that, now it is working without any NPE, thank you all  ^-^

Edited by Gries
  • 0
Posted (edited)

The error must be here:

 

                final L2Summon summon = killer.getSummon();
                if (summon.getOwner() != null)
                {
                    return false;
                }

 

You need to check first:

if (summon != null)

{

                final L2Summon summon = killer.getSummon();
                if (summon.getOwner() != null)
                {
                    return false;
                }

}

 

 

But this doesn't make sense too:

 

                if (((L2PcInstance) killer).getClan() == null)
                {
                    return false;
                }
                if (killer.getActingPlayer() != null)
                {

 

You firstly check if killer's clan == null and then if killer is null (?). Unless getActingPlayer() returns smth else.

Edited by An4rchy
  • 0
Posted

Solved NPE, thank you.

 

Still getting ClassCastException at line 185:

                if (((L2PcInstance) killer).getClan() == null)
                {
                    return false;
                }

When a summon kills it.

  • 0
Posted (edited)

if (summon != null)

{

                final L2Summon summon = killer.getSummon();

                if (summon.getOwner() != null)

                {

                    return false;

                }

}

 

It's only me or it's kinda meh ? :P

 

I'd do like that

final L2Summon summon = killer.getPet();
if (summon != null)
   return false;
Edited by SweeTs
  • 0
Posted (edited)

look... the way it is coded is horrible... if you call something you're supposed to do it like it:

final L2PcInstance player = killer.getActingPlayer();
if (player != null) {
    final L2Clan clan = player.getClan();

    if (clan != null) {
          clan.doAnythingYouWish();
    }

    player.doAnythingYouWish();
}

and definetly NOT:

if (killer.getActingPlayer() != null) {
     if (((L2PcInstance) killer).getClan() != null) {
         ((L2PcInstance) killer).getClan().doAnythingYouWish();
    }

    ((L2PcInstance) killer).doAnythingYouWish();
}
Edited by lord_rex
  • 0
Posted

 

look... the way it is coded is horrible... if you call something you're supposed to do it like it:

final L2PcInstance player = killer.getActingPlayer();
if (player != null) {
    final L2Clan clan = player.getClan();

    if (clan != null) {
          clan.doAnythingYouWish();
    }

    player.doAnythingYouWish();
}

and definetly NOT:

if (killer.getActingPlayer() != null) {
     if (((L2PcInstance) killer).getClan() != null) {
         ((L2PcInstance) killer).getClan().doAnythingYouWish();
    }

    ((L2PcInstance) killer).doAnythingYouWish();
}

 

the best way for me is:

 

if (killer.getActingPlayer != null)

{     if (killer.getActingPlayer().getClan() != null)

      {         killer.getActingPlayer().getClan().doSmth();

      }

      killer.doSmth()

}

 

getActingPlayer turns L2Object into L2PcInstance without cast if the L2Object is instanceof L2PcInstance otherwise null.

 

Thus I would use your method if I wanted to apply more methods than one

  • 0
Posted

the best way for me is:

 

if (killer.getActingPlayer != null)

{     if (killer.getActingPlayer().getClan() != null)

      {         killer.getActingPlayer().getClan().doSmth();

      }

      killer.doSmth()

}

 

getActingPlayer turns L2Object into L2PcInstance without cast if the L2Object is instanceof L2PcInstance otherwise null.

 

Thus I would use your method if I wanted to apply more methods than one

no... with your code you call killer.getActingPlayer() 3 times, my way calls it only once and avoids the casting also, and as you see, it is helped on Gries :)

  • 0
Posted (edited)

no... with your code you call killer.getActingPlayer() 3 times, my way calls it only once and avoids the casting also, and as you see, it is helped on Gries :)

 

It all depends on coding style, I just don't like to occupy memory when not needed, old C traits ;p

Edited by xdem
  • 0
Posted

It all depends on coding style, I just don't like to occupy memory when not needed, old C traits ;p

memory rather than CPU ;)

Guest
This topic is now closed to further replies.


×
×
  • Create New...