Jump to content
  • 0

Extract char_id from crafted items card position 3 & 4


Sehrentos

Question


  • Group:  Members
  • Topic Count:  6
  • Topics Per Day:  0.00
  • Content Count:  91
  • Reputation:   22
  • Joined:  10/24/14
  • Last Seen:  

Hello,

Is it possible to calculate and extract the crafted items char_id from card position 3 and 4 ?
I have this test script, where i'm trying to extract as many data from the crafted items as possible and show results.

In docs char_id is calculated: @card3 = @charid & 65535; @card4 = @charid >> 16; when crafting them.

-	script	#atcmd_test	-1,{
OnInit:
	bindatcmd "test", strnpcinfo(3)+"::OnAtCommand";
	end;

OnAtCommand:
	if (getgmlevel() < 60) end;
	.@char_id = getcharid(0);
	getinventorylist( .@char_id );
	for( .@i = 0; .@i<@inventorylist_count; .@i++ ) {
		if(@inventorylist_card1[.@i] == CARD0_PET) {
			message strcharinfo(0), (.@i+1) +". [Pet] "+ getitemname(@inventorylist_id[.@i]) +
			" ("+ @inventorylist_amount[.@i] +")";
		}
		else if(@inventorylist_card1[.@i] == CARD0_FORGE) {
			message strcharinfo(0), (.@i+1) +". [Forge]" +
			(@inventorylist_refine[.@i] ? " +"+ @inventorylist_refine[.@i] : "") +
			" "+ callsub(S_ForgeProperty, @inventorylist_card2[.@i]) +
			" "+ getitemname(@inventorylist_id[.@i]) + 
			" ("+ @inventorylist_amount[.@i] +")" +
			(@inventorylist_equip[.@i] > 0 ? " Equiped: "+ callsub(S_EquipPosition,@inventorylist_equip[.@i]) : "") +
			(@inventorylist_attribute[.@i] ? " broken" : "");
			// for debugs:
			//(@inventorylist_card2[.@i] ? " card-2:" + @inventorylist_card2[.@i] : "") +
			//(@inventorylist_card3[.@i] ? " card-3:" + @inventorylist_card3[.@i] : "") +
			//(@inventorylist_card4[.@i] ? " card-4:" + @inventorylist_card4[.@i] : "");
		}
		else if(@inventorylist_card1[.@i] == CARD0_CREATE) {
			message strcharinfo(0), (.@i+1) +". [Create]" +
			(@inventorylist_refine[.@i] ? " +"+ @inventorylist_refine[.@i] : "") +
			" "+ getitemname(@inventorylist_id[.@i]) + 
			" ("+ @inventorylist_amount[.@i] +")" +
			(@inventorylist_equip[.@i] > 0 ? " Equiped: "+ callsub(S_EquipPosition,@inventorylist_equip[.@i]) : "");
			// for debugs:
			//(@inventorylist_card2[.@i] ? " card-2:" + @inventorylist_card2[.@i] : "") +
			//(@inventorylist_card3[.@i] ? " card-3:" + @inventorylist_card3[.@i] : "") +
			//(@inventorylist_card4[.@i] ? " card-4:" + @inventorylist_card4[.@i] : "");
		}
		else if (@inventorylist_equip[.@i] > 0) {
			// Equiped items
			message strcharinfo(0), (.@i+1) +"." +
			(@inventorylist_refine[.@i] ? " +"+ @inventorylist_refine[.@i] : "") +
			" "+ getitemname(@inventorylist_id[.@i]) + 
			" ("+ @inventorylist_amount[.@i] +")" +
			" Equiped: "+ callsub(S_EquipPosition,@inventorylist_equip[.@i]) +
			(@inventorylist_identify[.@i] ? "" : " unidentified") +
			(@inventorylist_attribute[.@i] ? " broken" : "") +
			(@inventorylist_card1[.@i] ? " card-1:" + @inventorylist_card1[.@i] : "") + //@inventorylist_card1[.@i] == 256 is Egg
			(@inventorylist_card2[.@i] ? " card-2:" + @inventorylist_card2[.@i] : "") +
			(@inventorylist_card3[.@i] ? " card-3:" + @inventorylist_card3[.@i] : "") +
			(@inventorylist_card4[.@i] ? " card-4:" + @inventorylist_card4[.@i] : "");
		}
		else {
			// Other inventory items
			message strcharinfo(0), (.@i+1) +"." +
			(@inventorylist_refine[.@i] ? " +"+ @inventorylist_refine[.@i] : "") +
			" "+ getitemname(@inventorylist_id[.@i]) +
			" ("+ @inventorylist_amount[.@i] +")" +
			(@inventorylist_identify[.@i] ? "" : " unidentified") +
			(@inventorylist_attribute[.@i] ? " broken" : "") +
			(@inventorylist_card1[.@i] ? " card-1:" + @inventorylist_card1[.@i] : "") +
			(@inventorylist_card2[.@i] ? " card-2:" + @inventorylist_card2[.@i] : "") +
			(@inventorylist_card3[.@i] ? " card-3:" + @inventorylist_card3[.@i] : "") +
			(@inventorylist_card4[.@i] ? " card-4:" + @inventorylist_card4[.@i] : "");
		}
		//debugmes "Equip: "+ getitemname(@inventorylist_id[.@i]) + ": "+@inventorylist_equip[.@i];
	}
	end;

S_ForgeProperty:
	.@attr = getarg(0);
	// 1 - Ice, 2 - Earth 3 - Fire 4 - Wind.
	// Calc formula: ElementNumber + ((StarCrubNumber * 5) << 8)
	switch(.@attr) {
		case 3840: .@name$ = "Very Very Very Strong Neutral"; break;
		case 3841: .@name$ = "Very Very Very Strong Ice"; break;
		case 3842: .@name$ = "Very Very Very Strong Earth"; break;
		case 3843: .@name$ = "Very Very Very Strong Fire"; break;
		case 3844: .@name$ = "Very Very Very Strong Wind"; break;
		case 2560: .@name$ = "Very Very Strong Neutral"; break;
		case 2561: .@name$ = "Very Very Strong Ice"; break;
		case 2562: .@name$ = "Very Very Strong Earth"; break;
		case 2563: .@name$ = "Very Very Strong Fire"; break;
		case 2564: .@name$ = "Very Very Strong Wind"; break;
		case 1280: .@name$ = "Very Strong Neutral"; break;
		case 1281: .@name$ = "Very Strong Ice"; break;
		case 1282: .@name$ = "Very Strong Earth"; break;
		case 1283: .@name$ = "Very Strong Fire"; break;
		case 1284: .@name$ = "Very Strong Wind"; break;
		case 0: .@name$ = "Neutral"; break;
		case 1: .@name$ = "Ice"; break;
		case 2: .@name$ = "Earth"; break;
		case 3: .@name$ = "Fire"; break;
		case 4: .@name$ = "Wind"; break;
		default: .@name$ = ""; break;
	}
	//debugmes "Calc value: "+ .@attr;
	//debugmes "Calc result: "+ .@name$;
	return .@name$;

S_EquipPosition:
	.@idx = getarg(0);
	if(.@idx == EQP_ACC_L) {
		.@name$ = "Accessory Left";
	} else if(.@idx == EQP_ACC_R) {
		.@name$ = "Accessory Right";
	} else if(.@idx == EQP_SHOES) {
		.@name$ = "Shoes";
	} else if(.@idx == EQP_GARMENT) {
		.@name$ = "Garment";
	} else if(.@idx == EQP_HEAD_LOW) {
		.@name$ = "Head lower";
	} else if(.@idx == EQP_HEAD_MID) {
		.@name$ = "Head middle";
	} else if(.@idx == EQP_HEAD_TOP) {
		.@name$ = "Head top";
	} else if(.@idx == EQP_ARMOR) {
		.@name$ = "Armor";
	} else if(.@idx == EQP_HAND_L) {
		.@name$ = "Hand Left";
	} else if(.@idx == EQP_HAND_R) {
		.@name$ = "Hand Right";
	} else if(.@idx == EQP_HAND_L + EQP_HAND_R) {
		.@name$ = "Hands Left & Right";
	} else if(.@idx == EQP_COSTUME_HEAD_TOP) {
		.@name$ = "C-Head top";
	} else if(.@idx == EQP_COSTUME_HEAD_MID) {
		.@name$ = "C-Head middle";
	} else if(.@idx == EQP_COSTUME_HEAD_LOW) {
		.@name$ = "C-Head lower";
	} else if(.@idx == EQP_COSTUME_GARMENT) {
		.@name$ = "C-Garment";
	} else if(.@idx == EQP_AMMO) {
		.@name$ = "Ammonition";
	} else if(.@idx == EQP_SHADOW_ARMOR) {
		.@name$ = "S-Armor";
	} else if(.@idx == EQP_SHADOW_WEAPON) {
		.@name$ = "S-Weapon";
	} else if(.@idx == EQP_SHADOW_SHIELD) {
		.@name$ = "S-Shield";
	} else if(.@idx == EQP_SHADOW_SHOES) {
		.@name$ = "S-Shoes";
	} else if(.@idx == EQP_SHADOW_ACC_R) {
		.@name$ = "S-Accessory Right";
	} else if(.@idx == EQP_SHADOW_ACC_L) {
		.@name$ = "S-Accessory Left";
	} else if(.@idx == EQP_ACC_RL) {
		.@name$ = "Accessory Both";
	} else if(.@idx == EQP_SHADOW_ACC_RL) {
		.@name$ = "S-Accessory Both";
	} else {
		.@name$ = "";
	}
	return .@name$;
}

Thanks in advance.

Edited by Sehrentos
Notes
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 1

  • Group:  Members
  • Topic Count:  1
  • Topics Per Day:  0.00
  • Content Count:  3
  • Reputation:   2
  • Joined:  09/24/18
  • Last Seen:  

When you're referring to docs i guess you meant these lines:

    // Now we split the character ID number into two portions with a binary
    // shift operation. If you don't understand what this does, just copy it.
    @card3 = @charid & 65535;
    @card4 = @charid >> 16;

If that is the case then i think it would be possible to retrieve it (assuming we're operating on a 32bit system):

@card3 is storing the LAST 16 bits of the character's ID
@card4 is storing the FIRST 16 bits of the character's ID

So you'll just need to perform a left shift by 16 bits and perform a bitwise OR

@crafter_char_id = (@inventorylist_card4[.@i] << 16) | @inventorylist_card3[.@i];

Let me know if that works

  • Like 1
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  6
  • Topics Per Day:  0.00
  • Content Count:  91
  • Reputation:   22
  • Joined:  10/24/14
  • Last Seen:  

Thank you @Rene

That worked for me /no1

This is the final result if any one is interested:

// callsub(S_ForgeProperty, @inventorylist_card2[.@i], @inventorylist_card3[.@i], @inventorylist_card4[.@i])
S_ForgeProperty:
	.@card2 = getarg(0);
	.@card3 = getarg(1);
	.@card4 = getarg(2);
	// 1 - Ice, 2 - Earth 3 - Fire 4 - Wind.
	// Calc formula: ElementNumber + ((StarCrubNumber * 5) << 8)
	.@char_id = (.@card4 << 16) | .@card3;
	// Character ID's start from 150000
	if (.@char_id >= 150000) {
		// Using strcharinfo(0,.@char_id) will throw Error if player is offline...
		// So we use good old SQL query:
		query_sql("SELECT name FROM `char` WHERE `char_id`="+.@char_id, .@char_name$);
	} else {
		setarray .@char_name$[0], "Unknown";
	}
	switch(.@card2) {
		case 3840: .@name$ = "Very Very Very Strong "+ .@char_name$[0] +"'s Neutral"; break;
		case 3841: .@name$ = "Very Very Very Strong "+ .@char_name$[0] +"'s Ice"; break;
		case 3842: .@name$ = "Very Very Very Strong "+ .@char_name$[0] +"'s Earth"; break;
		case 3843: .@name$ = "Very Very Very Strong "+ .@char_name$[0] +"'s Fire"; break;
		case 3844: .@name$ = "Very Very Very Strong "+ .@char_name$[0] +"'s Wind"; break;
		case 2560: .@name$ = "Very Very Strong "+ .@char_name$[0] +"'s Neutral"; break;
		case 2561: .@name$ = "Very Very Strong "+ .@char_name$[0] +"'s Ice"; break;
		case 2562: .@name$ = "Very Very Strong "+ .@char_name$[0] +"'s Earth"; break;
		case 2563: .@name$ = "Very Very Strong "+ .@char_name$[0] +"'s Fire"; break;
		case 2564: .@name$ = "Very Very Strong "+ .@char_name$[0] +"'s Wind"; break;
		case 1280: .@name$ = "Very Strong "+ .@char_name$[0] +"'s Neutral"; break;
		case 1281: .@name$ = "Very Strong "+ .@char_name$[0] +"'s Ice"; break;
		case 1282: .@name$ = "Very Strong "+ .@char_name$[0] +"'s Earth"; break;
		case 1283: .@name$ = "Very Strong "+ .@char_name$[0] +"'s Fire"; break;
		case 1284: .@name$ = "Very Strong "+ .@char_name$[0] +"'s Wind"; break;
		case 0: .@name$ = .@char_name$[0] +"'s Neutral"; break;
		case 1: .@name$ = .@char_name$[0] +"'s Ice"; break;
		case 2: .@name$ = .@char_name$[0] +"'s Earth"; break;
		case 3: .@name$ = .@char_name$[0] +"'s Fire"; break;
		case 4: .@name$ = .@char_name$[0] +"'s Wind"; break;
		default: .@name$ = ""; break;
	}
	return .@name$;

 

Edited by Sehrentos
Notes
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...