Dealing with Units menu

Shout-Out

User Tag List

Results 1 to 11 of 11
  1. #1
    Unkn0wn0x's Avatar Member
    Reputation
    6
    Join Date
    Aug 2009
    Posts
    39
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Dealing with Units

    Hello all,

    i tried a lot but i really don't get it.

    I'm trying to deal with units and i try to read out if a unit is attackable or not.

    What i tried:


    • Running througth the object list
    • Checking if its an Unit with following code:

    Code:
    //-----------------------------------------------------------------------------
    short YaWoWObject::objectType(uint aCurObject)
    {
       try
       {
          return mem.readShort((void*)(aCurObject + YaWoWOffsets::ObjectTypeOffset));
       }
       catch(...)
       {
          // -9 for error handling
          return -9;
       }
    }
    It returns 3 (the object is a valid unit ).
    Ok so far everythink works I'm able to check if a unit is there.

    Now i want to improve it i want to check if this unit is neutral, or attackable or whatelse.

    But i've got a problem which i could not solve yet. I tried 3 Offsets, UNIT_FIELD_FLAGS , UNIT_FIELD_FLAGS2 and UNIT_NPC_FlAGS. But nothing works correctly for me.

    As example i read the Flag with following code:

    Code:
    //-----------------------------------------------------------------------------
    int YaWoWObject::objectFlags(uint aCurObject)
    {
       try
       {
          int nFlag =
             mem.readInt(
             (void*)((mem.readUInt(
             (void*)(aCurObject + 0x8))) + YaWoWOffsets::UNIT_NPC_FLAGS * 4));
    
          return nFlag;
       }
       catch (...)
       {
          // -9 for error handling
          return -9;
       }
    }
    If the current object is a auctioneer it returns 2097152 which is the correct value for auctioneers.

    But if the current object is an unfriendly NPC (a Mob which is attackable) it returns 0. If the current object is a neutral NPC which is not attackable it returns 0, too.

    My question is now how to deal with units.
    How can i check if a UNIT is attackable or not? Does anyone knows that?

    Greetings,

    Unkn0wn0x


    Dealing with Units
  2. #2
    cenron's Avatar Member
    Reputation
    12
    Join Date
    Mar 2008
    Posts
    93
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Check out UnitReaction

    Code:
    text:006B86A0 CGUnit_C__UnitReaction proc near        ; CODE XREF: CGUnit_C__IsUnitFriendly__+Ap
    It will tell you everything you need to know. Returns if the unit is friendly, hostile or neutral to you.

    You can also look into CGUnit_C::CanAttack( CGUnit_C * );

    Code:
    text:006BC8F0 CGUnit_C__CanAttack__ proc near         ; CODE XREF: sub_49D210+A6p
    Returns 1 if attackable 0 if not attackable.

  3. #3
    Unkn0wn0x's Avatar Member
    Reputation
    6
    Join Date
    Aug 2009
    Posts
    39
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by cenron View Post
    Check out UnitReaction

    Code:
    text:006B86A0 CGUnit_C__UnitReaction proc near        ; CODE XREF: CGUnit_C__IsUnitFriendly__+Ap
    It will tell you everything you need to know. Returns if the unit is friendly, hostile or neutral to you.

    You can also look into CGUnit_C::CanAttack( CGUnit_C * );

    Code:
    text:006BC8F0 CGUnit_C__CanAttack__ proc near         ; CODE XREF: sub_49D210+A6p
    Returns 1 if attackable 0 if not attackable.
    Hello cenron,

    i want to thank you for this nice information.
    I looked this function up in IDA and I'm a bit confused.

    As you told me to look in CGUNIT_C:CanAttack( *); its seems that it needs one parameter but if i generate the pseudocode it needs two. Thats why im a bit confused if its the right function.

    In the pseudocode i see it returns 1 or 0 thats ok. But actually I'm having problems to get this function to a working offset cause I'm not a reversing expert.

    I dont want the offset from you but a bit help to get it from that function and how to get it would be ok.

    Sure i tried it but if i read it it returns me either 0 or something like 109238109283 or so. : D

    (The pseudocode i got from this function)

    Code:
     bool __stdcall sub_49D210(int a1,int a2)
    {
      int v2; // ebx@1
      int v3; // esi@1
      char v5; // zf@22
      char v6; // bl@28
      int v7; // edx@3
      int v8; // eax@6
      int v9; // edx@6
      int v10; // eax@6
      int v11; // eax@29
      int v12; // et0@31
      char v13; // zf@31
      int v14; // [sp+2C8h] [bp-8h]@3
      int v15; // [sp+2CCh] [bp-4h]@3
      char v16; // [sp+8h] [bp-2C8h]@29
      int v17; // [sp+24h] [bp-2ACh]@30
      int v18; // [sp+2Ch] [bp-2A4h]@31
    
      v2 = a2;
      v3 = a1;
      if ( !(a2 & 0x20) )
      {
        if ( (unsigned __int8)sub_475950() || (v14 = sub_47A2B0(), v15 = v7, (unsigned __int8)sub_49D110(&v14)) )
          return 0;
      }
      if ( v2 & 0xF0000 )
      {
        v8 = sub_47A2B0();
        sub_47B8B0(v8, v9, 16);
        v10 = v2;
        v10 &= 0x40000u;
        a2 = v10;
        if ( v10 && !(unsigned __int8)sub_6BC580(v3, 0) )
        {
          if ( !((unsigned int)((char *)loc_7FFFFF + 1) & v2)
            || !(*(_DWORD *)(*(_DWORD *)(v3 + 208) + 28) | *(_DWORD *)(*(_DWORD *)(v3 + 208) + 24))
            || !(unsigned __int8)sub_6BC8F0(v3) )
            return 0;
          return 1;
        }
        if ( (!(v2 & 0x10000) || !(unsigned __int8)sub_6AC0B0(v3))
          && (!(v2 & 0x20000) || !(unsigned __int8)sub_6AC180(v3))
          && (!a2 || !(unsigned __int8)sub_6BC580(v3, 0))
          && (!(v2 & 0x80000) || !(unsigned __int8)sub_6BC8F0(v3)) )
          return 0;
      }
      if ( v2 & 0x300000 )
      {
        if ( !(*(_DWORD *)(*(_DWORD *)(v3 + 208) + 68) > 0) )
          v5 = (v2 & 0x200000) == 0;
        else
          v5 = (v2 & 0x100000) == 0;
        if ( v5 )
          return 0;
      }
      if ( v2 & 0x400000 && sub_6B29A0() == 12 || !(unsigned __int8)__uncaught_exception() )
        return 1;
      v6 = (*(_WORD *)(*(_DWORD *)(v3 + 208) + 208) >> 8) & 1;
      if ( v6 )
      {
        sub_9554C0();
        v11 = sub_7D6350();
        if ( sub_476820(v11, &v16) )
        {
          if ( v17 & 0x10000000 || (v12 = v18, v12 &= 0x200000u, v13 = v12 == 0, !v13) )
          {
            nullsub_5();
            return 1;
          }
        }
        nullsub_5();
      }
      return v6 == 0;
    }
    
    

    Greetings,

    Unkn0wn0x

  4. #4
    MaiN's Avatar Elite User
    Reputation
    335
    Join Date
    Sep 2006
    Posts
    1,047
    Thanks G/R
    0/10
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    0x6BC8F0: char __thiscall CGUnit_C__CanAttack(CGUnit_C *this, CGUnit_C *otherUnit)

    Code:
    char __thiscall CGUnit_C__CanAttack(CGUnit_C *this, CGUnit_C *otherUnit)
    {
      CGUnit_C *_this; // ebx@1
      CGUnit_C *_otherUnit; // esi@4
      DWORD v5; // eax@6
      unsigned __int32 v6; // eax@9
      char v7; // al@14
      unsigned __int32 v8; // ecx@14
      char v9; // al@18
      sUnitFields *v10; // edi@18
      DWORD v11; // eax@24
      int v12; // ecx@25
      DWORD v13; // eax@27
      int v14; // edi@28
      char v15; // al@36
      sUnitFields *v16; // edi@36
      int v17; // eax@45
      int v18; // edi@45
      int v19; // edi@47
      int v20; // eax@48
      unsigned __int8 v21; // al@51
      char v22; // zf@53
      unsigned __int8 v23; // cl@54
      char v24; // [sp+Fh] [bp+Bh]@44
    
      _this = this;
      if ( (this->ObjectInfo.ObjectDescriptors->OBJECT_FIELD_TYPE >> 4) & 1 && (*(_DWORD *)(this->Unk2[964] + 8) >> 19) & 1 )
        return 0;
      _otherUnit = otherUnit;
      if ( (otherUnit->ObjectInfo.ObjectDescriptors->OBJECT_FIELD_TYPE >> 4) & 1 )
      {
        if ( (*(_DWORD *)(otherUnit->Unk2[964] + 8) >> 4) & 1 )
        {
          v5 = this->Unk2[539];
          if ( !v5 || !(*(_BYTE *)(v5 + 12) & 2) )
            return 0;
        }
      }
      v6 = otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS;
      if ( (v6 >> 1) & 1
        || (v6 >> 20) & 1
        || (v6 >> 7) & 1
        || (v6 >> 16) & 1
        || (v6 >> 25) & 1
        || (v8 = this->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS,
            (v7 = (_this->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1) != 0)
        && (LOWORD(otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS) >> 8) & 1
        || !v7 && (otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 9) & 1
        || (v10 = otherUnit->ObjectInfo.UnitDescriptors, (v9 = (v10->UNIT_FIELD_FLAGS >> 3) & 1) != 0) && BYTE1(v8) & 1
        || !v9 && (v8 >> 9) & 1
        || (BYTE2(_this->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS_2) & 1 || BYTE2(v10->UNIT_FIELD_FLAGS_2) & 1)
        && ((v11 = _this->Unk2[921], !v11) ? (v12 = 0) : (v12 = *(_DWORD *)(v11 + 12)),
            (v13 = otherUnit->Unk2[921], !v13) ? (v14 = 0) : (v14 = *(_DWORD *)(v13 + 12)),
            v12 && *(_DWORD *)(v12 + 4) & 0x20000000 && sub_6DF920(otherUnit, _this) == _this
         || v14 && *(_DWORD *)(v14 + 4) & 0x20000000 && sub_6DF920(_this, otherUnit) == otherUnit) )
        return 0;
      v16 = _this->ObjectInfo.UnitDescriptors;
      v15 = (v16->UNIT_FIELD_FLAGS >> 3) & 1;
      if ( v15 || (otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1 )
      {
        if ( v15 && (otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1 )
        {
          v24 = 0;
          if ( !sub_4B9B60((int)_this, (int)_otherUnit) )
          {
            v18 = sub_6ABF80(_this);
            v17 = sub_6ABF80(_otherUnit);
            if ( v18 && v17 )
            {
              v19 = *(_DWORD *)(v18 + 4104);
              if ( *(_DWORD *)(v19 + 32) )
              {
                v20 = *(_DWORD *)(v17 + 4104);
                if ( *(_DWORD *)(v20 + 32) )
                {
                  if ( *(_DWORD *)v19 == *(_DWORD *)v20 && *(_DWORD *)(v19 + 4) == *(_DWORD *)(v20 + 4) )
                    return 1;
                }
              }
              v21 = _otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1];
              if ( v21 & 1 )
              {
                if ( _this->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8 )
                  return v24;
                v22 = (v21 & 8) == 0;
              }
              else
              {
                v23 = _this->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1];
                if ( v23 & 4 && v21 & 4 )
                  return 1;
                if ( !(v23 & 2) && !(v21 & 2) || v23 & 8 )
                  return v24;
                v22 = (v21 & 8) == 0;
              }
            }
            else
            {
              if ( _this->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8 )
                return v24;
              v22 = (_otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8) == 0;
            }
            if ( v22 )
              return 1;
          }
          return v24;
        }
        if ( (!v15 || !(otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8))
          && (!((otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1) || !(v16->UNIT_FIELD_BYTES_2[1] & 8)) )
          return sub_4B9B60((int)_this, (int)otherUnit) == 0;
        return 0;
      }
      return sub_4B9B90((int)_this, (int)otherUnit) || sub_4B9B90((int)otherUnit, (int)_this);
    }
    Last edited by MaiN; 01-30-2010 at 02:23 PM.
    [16:15:41] Cypher: caus the CPU is a dick
    [16:16:07] kynox: CPU is mad
    [16:16:15] Cypher: CPU is all like
    [16:16:16] Cypher: whatever, i do what i want

  5. #5
    Unkn0wn0x's Avatar Member
    Reputation
    6
    Join Date
    Aug 2009
    Posts
    39
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by MaiN View Post
    0x6BC8F0: char __thiscall CGUnit_C__CanAttack(CGUnit_C *this, CGUnit_C *otherUnit)

    Code:
    char __thiscall CGUnit_C__CanAttack(CGUnit_C *this, CGUnit_C *otherUnit)
    {
      CGUnit_C *_this; // ebx@1
      CGUnit_C *_otherUnit; // esi@4
      DWORD v5; // eax@6
      unsigned __int32 v6; // eax@9
      char v7; // al@14
      unsigned __int32 v8; // ecx@14
      char v9; // al@18
      sUnitFields *v10; // edi@18
      DWORD v11; // eax@24
      int v12; // ecx@25
      DWORD v13; // eax@27
      int v14; // edi@28
      char v15; // al@36
      sUnitFields *v16; // edi@36
      int v17; // eax@45
      int v18; // edi@45
      int v19; // edi@47
      int v20; // eax@48
      unsigned __int8 v21; // al@51
      char v22; // zf@53
      unsigned __int8 v23; // cl@54
      char v24; // [sp+Fh] [bp+Bh]@44
    
      _this = this;
      if ( (this->ObjectInfo.ObjectDescriptors->OBJECT_FIELD_TYPE >> 4) & 1 && (*(_DWORD *)(this->Unk2[964] + 8) >> 19) & 1 )
        return 0;
      _otherUnit = otherUnit;
      if ( (otherUnit->ObjectInfo.ObjectDescriptors->OBJECT_FIELD_TYPE >> 4) & 1 )
      {
        if ( (*(_DWORD *)(otherUnit->Unk2[964] + 8) >> 4) & 1 )
        {
          v5 = this->Unk2[539];
          if ( !v5 || !(*(_BYTE *)(v5 + 12) & 2) )
            return 0;
        }
      }
      v6 = otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS;
      if ( (v6 >> 1) & 1
        || (v6 >> 20) & 1
        || (v6 >> 7) & 1
        || (v6 >> 16) & 1
        || (v6 >> 25) & 1
        || (v8 = this->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS,
            (v7 = (_this->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1) != 0)
        && (LOWORD(otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS) >> 8) & 1
        || !v7 && (otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 9) & 1
        || (v10 = otherUnit->ObjectInfo.UnitDescriptors, (v9 = (v10->UNIT_FIELD_FLAGS >> 3) & 1) != 0) && BYTE1(v8) & 1
        || !v9 && (v8 >> 9) & 1
        || (BYTE2(_this->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS_2) & 1 || BYTE2(v10->UNIT_FIELD_FLAGS_2) & 1)
        && ((v11 = _this->Unk2[921], !v11) ? (v12 = 0) : (v12 = *(_DWORD *)(v11 + 12)),
            (v13 = otherUnit->Unk2[921], !v13) ? (v14 = 0) : (v14 = *(_DWORD *)(v13 + 12)),
            v12 && *(_DWORD *)(v12 + 4) & 0x20000000 && sub_6DF920(otherUnit, _this) == _this
         || v14 && *(_DWORD *)(v14 + 4) & 0x20000000 && sub_6DF920(_this, otherUnit) == otherUnit) )
        return 0;
      v16 = _this->ObjectInfo.UnitDescriptors;
      v15 = (v16->UNIT_FIELD_FLAGS >> 3) & 1;
      if ( v15 || (otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1 )
      {
        if ( v15 && (otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1 )
        {
          v24 = 0;
          if ( !sub_4B9B60((int)_this, (int)_otherUnit) )
          {
            v18 = sub_6ABF80(_this);
            v17 = sub_6ABF80(_otherUnit);
            if ( v18 && v17 )
            {
              v19 = *(_DWORD *)(v18 + 4104);
              if ( *(_DWORD *)(v19 + 32) )
              {
                v20 = *(_DWORD *)(v17 + 4104);
                if ( *(_DWORD *)(v20 + 32) )
                {
                  if ( *(_DWORD *)v19 == *(_DWORD *)v20 && *(_DWORD *)(v19 + 4) == *(_DWORD *)(v20 + 4) )
                    return 1;
                }
              }
              v21 = _otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1];
              if ( v21 & 1 )
              {
                if ( _this->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8 )
                  return v24;
                v22 = (v21 & 8) == 0;
              }
              else
              {
                v23 = _this->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1];
                if ( v23 & 4 && v21 & 4 )
                  return 1;
                if ( !(v23 & 2) && !(v21 & 2) || v23 & 8 )
                  return v24;
                v22 = (v21 & 8) == 0;
              }
            }
            else
            {
              if ( _this->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8 )
                return v24;
              v22 = (_otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8) == 0;
            }
            if ( v22 )
              return 1;
          }
          return v24;
        }
        if ( (!v15 || !(otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_BYTES_2[1] & 8))
          && (!((otherUnit->ObjectInfo.UnitDescriptors->UNIT_FIELD_FLAGS >> 3) & 1) || !(v16->UNIT_FIELD_BYTES_2[1] & 8)) )
          return sub_4B9B60((int)_this, (int)otherUnit) == 0;
        return 0;
      }
      return sub_4B9B90((int)_this, (int)otherUnit) || sub_4B9B90((int)otherUnit, (int)_this);
    }

    Why do you have such a nice output?

  6. #6
    MaiN's Avatar Elite User
    Reputation
    335
    Join Date
    Sep 2006
    Posts
    1,047
    Thanks G/R
    0/10
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Unkn0wn0x View Post
    Why do you have such a nice output?
    I made structs inside of IDA. Shift + F1.
    [16:15:41] Cypher: caus the CPU is a dick
    [16:16:07] kynox: CPU is mad
    [16:16:15] Cypher: CPU is all like
    [16:16:16] Cypher: whatever, i do what i want

  7. #7
    TOM_RUS's Avatar Legendary
    Reputation
    914
    Join Date
    May 2008
    Posts
    699
    Thanks G/R
    0/52
    Trade Feedback
    0 (0%)
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

  8. #8
    flo8464's Avatar Active Member
    Reputation
    30
    Join Date
    Apr 2009
    Posts
    434
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I made structs inside of IDA. Shift + F1.
    Is there something to have a better output when dealing with function pointers?

    Right now it looks like this ...
    Code:
    base = *(Gamebase *)GameBase;
        object = (*(int (__thiscall **)(DWORD, int, _DWORD))(base + Gamebase::GetObjectByKeyword))(GameBase, keyword, 0);
    Hey, it compiles! Ship it!

  9. #9
    Unkn0wn0x's Avatar Member
    Reputation
    6
    Join Date
    Aug 2009
    Posts
    39
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Get it to work now. Here is my code to check if its a Unit is in Combat or not.

    #802298 - Pastie

    (dont tell me , if ().. return true, else return false) its there cause debugging )

    ++ BIG Thanks to MaiN explaining me a lot of things

  10. #10
    amadmonk's Avatar Active Member
    Reputation
    124
    Join Date
    Apr 2008
    Posts
    772
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    try
    {
    return mem.readShort((void*)(aCurObject + YaWoWOffsets::ObjectTypeOffset));
    }
    catch(...)
    {
    // -9 for error handling
    return -9;
    }
    I'm not one of the "my programming peen is bigger than yours" brigade (I'm too damned old for that), but I have to chime in.

    This code is just awful for so many reasons.

    First, you should be using objects (or even just structs), not just blobs of unrelated pointers.

    Second, please don't return "magic numbers" like -9. You WILL forget what -9 means, some day, or you WILL reuse the value and break everything. At LEAST define an enum so that you can use something like OBJ_TYPE_INVALID or something; that will keep you from scratching your head some day and wondering "what the heck does -9 mean?"

    You will be much happier if you work on your coding style just a little bit.
    Don't believe everything you think.

  11. #11
    Unkn0wn0x's Avatar Member
    Reputation
    6
    Join Date
    Aug 2009
    Posts
    39
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by amadmonk View Post
    I'm not one of the "my programming peen is bigger than yours" brigade (I'm too damned old for that), but I have to chime in.

    This code is just awful for so many reasons.

    First, you should be using objects (or even just structs), not just blobs of unrelated pointers.

    Second, please don't return "magic numbers" like -9. You WILL forget what -9 means, some day, or you WILL reuse the value and break everything. At LEAST define an enum so that you can use something like OBJ_TYPE_INVALID or something; that will keep you from scratching your head some day and wondering "what the heck does -9 mean?"

    You will be much happier if you work on your coding style just a little bit.
    Yeah i know what you mean.

    Actually i fixed a lot of files but not everyone. Everytime im in a class now im fixing these things.

    But your statement is 100% true :P

Similar Threads

  1. Great addon for dealing with gold seller spams
    By cbass in forum World of Warcraft Guides
    Replies: 1
    Last Post: 12-04-2007, 08:38 AM
  2. Dealing with Exaustion with a Warlock
    By Calek in forum World of Warcraft Exploration
    Replies: 5
    Last Post: 08-06-2007, 03:55 PM
  3. Groups you've had to deal with...
    By Enfeebleness in forum World of Warcraft General
    Replies: 2
    Last Post: 01-29-2007, 01:58 AM
All times are GMT -5. The time now is 11:40 PM. Powered by vBulletin® Version 4.2.3
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Google Authenticator verification provided by Two-Factor Authentication (Free) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search