CDmxAttribute::UnserializeElement
0x00be1630 · 3076 bytes · __thiscall
_ZN13CDmxAttribute18UnserializeElementE17DmAttributeType_tR10CUtlBuffer
Decompiled
undefined (3 params)
/* CDmxAttribute::UnserializeElement(DmAttributeType_t, CUtlBuffer&) */
undefined4 __thiscall
CDmxAttribute::UnserializeElement(CDmxAttribute *this,int param_2,CUtlBuffer *param_3)
{
undefined4 *puVar1;
undefined4 uVar2;
CUtlString *this_00;
CUtlBinaryBlock *this_01;
float *pfVar3;
CUtlVector<VMatrix,CUtlMemory<VMatrix,int>> *this_02;
CUtlVector<Vector4D,CUtlMemory<Vector4D,int>> *this_03;
CUtlVector<QAngle,CUtlMemory<QAngle,int>> *this_04;
CUtlVector<Vector2D,CUtlMemory<Vector2D,int>> *this_05;
CUtlVector<CUtlString,CUtlMemory<CUtlString,int>> *this_06;
CUtlVector<DmeTime_t,CUtlMemory<DmeTime_t,int>> *this_07;
CUtlVector<CUtlBinaryBlock,CUtlMemory<CUtlBinaryBlock,int>> *this_08;
CUtlVector<float,CUtlMemory<float,int>> *this_09;
CUtlVector<bool,CUtlMemory<bool,int>> *this_10;
CUtlVector<Color,CUtlMemory<Color,int>> *this_11;
CUtlVector<int,CUtlMemory<int,int>> *this_12;
CUtlVector<Quaternion,CUtlMemory<Quaternion,int>> *this_13;
int iVar4;
VMatrix *pVVar5;
int in_GS_OFFSET;
bool bVar6;
float local_64;
float local_60;
float local_5c;
float local_58;
float local_54;
float local_50;
float local_4c;
float local_48;
float local_44;
float local_40;
float local_3c;
float local_38;
float local_34;
float local_30;
float local_2c;
float local_28;
undefined4 local_24;
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (0xd < param_2 - 0xfU) {
switchD_00be1666_default:
uVar2 = 0;
goto LAB_00be1672;
}
bVar6 = *(int *)this != param_2;
if (bVar6) {
AllocateDataMemory(this,param_2);
}
switch(param_2) {
case 0x10:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(int *)&local_64);
if ((char)uVar2 == '\0') break;
if (*(int *)this == 0x10) {
this_12 = *(CUtlVector<int,CUtlMemory<int,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x10);
puVar1 = *(undefined4 **)(this + 8);
this_12 = (CUtlVector<int,CUtlMemory<int,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_12 = *(CUtlVector<int,CUtlMemory<int,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_12 + 0xc);
CUtlVector<int,CUtlMemory<int,int>>::GrowVector(this_12,1);
CUtlVector<int,CUtlMemory<int,int>>::ShiftElementsRight(this_12,iVar4,1);
pfVar3 = (float *)(*(int *)this_12 + iVar4 * 4);
goto joined_r0x00be1d30;
case 0x11:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,&local_64);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x11) {
this_09 = *(CUtlVector<float,CUtlMemory<float,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x11);
puVar1 = *(undefined4 **)(this + 8);
this_09 = (CUtlVector<float,CUtlMemory<float,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_09 = *(CUtlVector<float,CUtlMemory<float,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_09 + 0xc);
CUtlVector<float,CUtlMemory<float,int>>::GrowVector(this_09,1);
CUtlVector<float,CUtlMemory<float,int>>::ShiftElementsRight(this_09,iVar4,1);
pfVar3 = (float *)(*(int *)this_09 + iVar4 * 4);
if (pfVar3 != (float *)0x0) {
*pfVar3 = local_64;
}
}
break;
case 0x12:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(bool *)&local_64);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x12) {
this_10 = *(CUtlVector<bool,CUtlMemory<bool,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x12);
puVar1 = *(undefined4 **)(this + 8);
this_10 = (CUtlVector<bool,CUtlMemory<bool,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_10 = *(CUtlVector<bool,CUtlMemory<bool,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_10 + 0xc);
CUtlVector<bool,CUtlMemory<bool,int>>::GrowVector(this_10,1);
CUtlVector<bool,CUtlMemory<bool,int>>::ShiftElementsRight(this_10,iVar4,1);
pVVar5 = (VMatrix *)(iVar4 + *(int *)this_10);
if (pVVar5 != (VMatrix *)0x0) {
*pVVar5 = local_64._0_1_;
}
}
break;
case 0x13:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
CUtlString::CUtlString((CUtlString *)&local_64);
/* try { // try from 00be1bcd to 00be1c69 has its CatchHandler @ 00be228e */
uVar2 = ::Unserialize(param_3,(CUtlString *)&local_64);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x13) {
this_06 = *(CUtlVector<CUtlString,CUtlMemory<CUtlString,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x13);
puVar1 = *(undefined4 **)(this + 8);
this_06 = (CUtlVector<CUtlString,CUtlMemory<CUtlString,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_06 = *(CUtlVector<CUtlString,CUtlMemory<CUtlString,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_06 + 0xc);
CUtlVector<CUtlString,CUtlMemory<CUtlString,int>>::GrowVector(this_06,1);
CUtlVector<CUtlString,CUtlMemory<CUtlString,int>>::ShiftElementsRight(this_06,iVar4,1);
this_00 = (CUtlString *)(iVar4 * 0x10 + *(int *)this_06);
if (this_00 != (CUtlString *)0x0) {
CUtlString::CUtlString(this_00,(CUtlString *)&local_64);
}
}
goto LAB_00be1e2e;
case 0x14:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
CUtlBinaryBlock::CUtlBinaryBlock((CUtlBinaryBlock *)&local_64,0,0);
/* try { // try from 00be1d95 to 00be1e2d has its CatchHandler @ 00be227c */
uVar2 = ::Unserialize(param_3,(CUtlBinaryBlock *)&local_64);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x14) {
this_08 = *(CUtlVector<CUtlBinaryBlock,CUtlMemory<CUtlBinaryBlock,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x14);
puVar1 = *(undefined4 **)(this + 8);
this_08 = (CUtlVector<CUtlBinaryBlock,CUtlMemory<CUtlBinaryBlock,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_08 = *(CUtlVector<CUtlBinaryBlock,CUtlMemory<CUtlBinaryBlock,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_08 + 0xc);
CUtlVector<CUtlBinaryBlock,CUtlMemory<CUtlBinaryBlock,int>>::GrowVector(this_08,1);
CUtlVector<CUtlBinaryBlock,CUtlMemory<CUtlBinaryBlock,int>>::ShiftElementsRight
(this_08,iVar4,1);
this_01 = (CUtlBinaryBlock *)(iVar4 * 0x10 + *(int *)this_08);
if (this_01 != (CUtlBinaryBlock *)0x0) {
CUtlBinaryBlock::CUtlBinaryBlock(this_01,(CUtlBinaryBlock *)&local_64);
}
}
LAB_00be1e2e:
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_64);
break;
case 0x15:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
local_64 = -0.0;
uVar2 = ::Unserialize(param_3,(DmeTime_t *)&local_64);
if ((char)uVar2 == '\0') break;
if (*(int *)this == 0x15) {
this_07 = *(CUtlVector<DmeTime_t,CUtlMemory<DmeTime_t,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x15);
puVar1 = *(undefined4 **)(this + 8);
this_07 = (CUtlVector<DmeTime_t,CUtlMemory<DmeTime_t,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_07 = *(CUtlVector<DmeTime_t,CUtlMemory<DmeTime_t,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_07 + 0xc);
CUtlVector<DmeTime_t,CUtlMemory<DmeTime_t,int>>::GrowVector(this_07,1);
CUtlVector<DmeTime_t,CUtlMemory<DmeTime_t,int>>::ShiftElementsRight(this_07,iVar4,1);
pfVar3 = (float *)(*(int *)this_07 + iVar4 * 4);
joined_r0x00be1d30:
if (pfVar3 != (float *)0x0) {
*pfVar3 = local_64;
}
break;
case 0x16:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
local_24 = 0;
uVar2 = ::Unserialize(param_3,(Color *)&local_24);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x16) {
this_11 = *(CUtlVector<Color,CUtlMemory<Color,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x16);
puVar1 = *(undefined4 **)(this + 8);
this_11 = (CUtlVector<Color,CUtlMemory<Color,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_11 = *(CUtlVector<Color,CUtlMemory<Color,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_11 + 0xc);
CUtlVector<Color,CUtlMemory<Color,int>>::GrowVector(this_11,1);
CUtlVector<Color,CUtlMemory<Color,int>>::ShiftElementsRight(this_11,iVar4,1);
puVar1 = (undefined4 *)(*(int *)this_11 + iVar4 * 4);
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = local_24;
}
}
break;
case 0x17:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(Vector2D *)&local_64);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x17) {
this_05 = *(CUtlVector<Vector2D,CUtlMemory<Vector2D,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x17);
puVar1 = *(undefined4 **)(this + 8);
this_05 = (CUtlVector<Vector2D,CUtlMemory<Vector2D,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_05 = *(CUtlVector<Vector2D,CUtlMemory<Vector2D,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_05 + 0xc);
CUtlVector<Vector2D,CUtlMemory<Vector2D,int>>::GrowVector(this_05,1);
CUtlVector<Vector2D,CUtlMemory<Vector2D,int>>::ShiftElementsRight(this_05,iVar4,1);
pfVar3 = (float *)(*(int *)this_05 + iVar4 * 8);
if (pfVar3 != (float *)0x0) {
*pfVar3 = local_64;
pfVar3[1] = local_60;
}
}
break;
case 0x18:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(Vector *)&local_64);
if ((char)uVar2 == '\0') break;
if (*(int *)this == 0x18) {
this_04 = *(CUtlVector<QAngle,CUtlMemory<QAngle,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x18);
puVar1 = *(undefined4 **)(this + 8);
this_04 = (CUtlVector<QAngle,CUtlMemory<QAngle,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_04 = *(CUtlVector<QAngle,CUtlMemory<QAngle,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_04 + 0xc);
CUtlVector<Vector,CUtlMemory<Vector,int>>::GrowVector
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)this_04,1);
CUtlVector<Vector,CUtlMemory<Vector,int>>::ShiftElementsRight
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)this_04,iVar4,1);
goto LAB_00be1a82;
case 0x19:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(Vector4D *)&local_64);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x19) {
this_03 = *(CUtlVector<Vector4D,CUtlMemory<Vector4D,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x19);
puVar1 = *(undefined4 **)(this + 8);
this_03 = (CUtlVector<Vector4D,CUtlMemory<Vector4D,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_03 = *(CUtlVector<Vector4D,CUtlMemory<Vector4D,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_03 + 0xc);
CUtlVector<Vector4D,CUtlMemory<Vector4D,int>>::GrowVector(this_03,1);
CUtlVector<Vector4D,CUtlMemory<Vector4D,int>>::ShiftElementsRight(this_03,iVar4,1);
pfVar3 = (float *)(iVar4 * 0x10 + *(int *)this_03);
if (pfVar3 != (float *)0x0) {
*pfVar3 = local_64;
pfVar3[1] = local_60;
pfVar3[2] = local_5c;
pfVar3[3] = local_58;
}
}
break;
case 0x1a:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(QAngle *)&local_64);
if ((char)uVar2 == '\0') break;
if (*(int *)this == 0x1a) {
this_04 = *(CUtlVector<QAngle,CUtlMemory<QAngle,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x1a);
puVar1 = *(undefined4 **)(this + 8);
this_04 = (CUtlVector<QAngle,CUtlMemory<QAngle,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_04 = *(CUtlVector<QAngle,CUtlMemory<QAngle,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_04 + 0xc);
CUtlVector<QAngle,CUtlMemory<QAngle,int>>::GrowVector(this_04,1);
CUtlVector<QAngle,CUtlMemory<QAngle,int>>::ShiftElementsRight(this_04,iVar4,1);
LAB_00be1a82:
pfVar3 = (float *)(*(int *)this_04 + iVar4 * 0xc);
if (pfVar3 != (float *)0x0) {
*pfVar3 = local_64;
pfVar3[1] = local_60;
pfVar3[2] = local_5c;
}
break;
case 0x1b:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(Quaternion *)&local_64);
if ((char)uVar2 != '\0') {
if (*(int *)this == 0x1b) {
this_13 = *(CUtlVector<Quaternion,CUtlMemory<Quaternion,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x1b);
puVar1 = *(undefined4 **)(this + 8);
this_13 = (CUtlVector<Quaternion,CUtlMemory<Quaternion,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
this_13 = *(CUtlVector<Quaternion,CUtlMemory<Quaternion,int>> **)(this + 8);
}
}
iVar4 = *(int *)(this_13 + 0xc);
CUtlVector<Quaternion,CUtlMemory<Quaternion,int>>::GrowVector(this_13,1);
CUtlVector<Quaternion,CUtlMemory<Quaternion,int>>::ShiftElementsRight(this_13,iVar4,1);
pfVar3 = (float *)(iVar4 * 0x10 + *(int *)this_13);
if (pfVar3 != (float *)0x0) {
*pfVar3 = local_64;
pfVar3[1] = local_60;
pfVar3[2] = local_5c;
pfVar3[3] = local_58;
}
}
break;
case 0x1c:
if ((bVar6) && (puVar1 = *(undefined4 **)(this + 8), puVar1 != (undefined4 *)0x0)) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
}
uVar2 = ::Unserialize(param_3,(VMatrix *)&local_64);
if ((char)uVar2 == '\0') break;
if (*(int *)this == 0x1c) {
LAB_00be172b:
this_02 = *(CUtlVector<VMatrix,CUtlMemory<VMatrix,int>> **)(this + 8);
}
else {
AllocateDataMemory(this,0x1c);
puVar1 = *(undefined4 **)(this + 8);
this_02 = (CUtlVector<VMatrix,CUtlMemory<VMatrix,int>> *)0x0;
if (puVar1 != (undefined4 *)0x0) {
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = 0;
puVar1[3] = 0;
puVar1[4] = 0;
goto LAB_00be172b;
}
}
iVar4 = *(int *)(this_02 + 0xc);
CUtlVector<VMatrix,CUtlMemory<VMatrix,int>>::GrowVector(this_02,1);
CUtlVector<VMatrix,CUtlMemory<VMatrix,int>>::ShiftElementsRight(this_02,iVar4,1);
pfVar3 = (float *)(iVar4 * 0x40 + *(int *)this_02);
if (pfVar3 != (float *)0x0) {
*pfVar3 = local_64;
pfVar3[1] = local_60;
pfVar3[2] = local_5c;
pfVar3[3] = local_58;
pfVar3[4] = local_54;
pfVar3[5] = local_50;
pfVar3[6] = local_4c;
pfVar3[7] = local_48;
pfVar3[8] = local_44;
pfVar3[9] = local_40;
pfVar3[10] = local_3c;
pfVar3[0xb] = local_38;
pfVar3[0xc] = local_34;
pfVar3[0xd] = local_30;
pfVar3[0xe] = local_2c;
pfVar3[0xf] = local_28;
}
break;
default:
goto switchD_00be1666_default;
}
LAB_00be1672:
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return uVar2;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.