| 674 | } |
| 675 | |
| 676 | void NetConnection::detachObject(GhostInfo *info) |
| 677 | { |
| 678 | // mark it for ghost killin' |
| 679 | info->flags |= GhostInfo::KillGhost; |
| 680 | |
| 681 | // if the mask is in the zero range, we've got to move it up... |
| 682 | if(!info->updateMask) |
| 683 | { |
| 684 | info->updateMask = 0xFFFFFFFF; |
| 685 | ghostPushNonZero(info); |
| 686 | } |
| 687 | if(info->obj) |
| 688 | { |
| 689 | if(info->prevObjectRef) |
| 690 | info->prevObjectRef->nextObjectRef = info->nextObjectRef; |
| 691 | else |
| 692 | info->obj->mFirstObjectRef = info->nextObjectRef; |
| 693 | if(info->nextObjectRef) |
| 694 | info->nextObjectRef->prevObjectRef = info->prevObjectRef; |
| 695 | |
| 696 | // remove it from the lookup table |
| 697 | U32 id = info->obj->getId(); |
| 698 | for(GhostInfo **walk = &mGhostLookupTable[id & (GhostLookupTableSize - 1)]; *walk; walk = &((*walk)->nextLookupInfo)) |
| 699 | { |
| 700 | GhostInfo *temp = *walk; |
| 701 | if(temp == info) |
| 702 | { |
| 703 | *walk = temp->nextLookupInfo; |
| 704 | break; |
| 705 | } |
| 706 | } |
| 707 | info->prevObjectRef = info->nextObjectRef = NULL; |
| 708 | info->obj = NULL; |
| 709 | } |
| 710 | } |
| 711 | |
| 712 | void NetConnection::freeGhostInfo(GhostInfo *ghost) |
| 713 | { |
no test coverage detected